xref: /utopia/UTPA2-700.0.x/modules/xc/drv/xc/mvideo.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) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 /// file    Mvideo.c
97 /// @brief  Main API in XC library
98 /// @author MStar Semiconductor Inc.
99 ///////////////////////////////////////////////////////////////////////////////////////////////////
100 #define  MVIDEO_C
101 
102 //-------------------------------------------------------------------------------------------------
103 //  Include Files
104 //-------------------------------------------------------------------------------------------------
105 // Common Definition
106 #ifdef MSOS_TYPE_LINUX_KERNEL
107 #include <linux/string.h>
108 #include <linux/module.h>   /* Needed by all modules */
109 #include <linux/kernel.h>   /* Needed for KERN_INFO */
110 #include <linux/slab.h>
111 #include <linux/uaccess.h>
112 #include <linux/compat.h>
113 #else
114 #include <string.h>
115 #include <stdlib.h>
116 #endif
117 //#include <assert.h>
118 
119 #include "UFO.h"
120 
121 #include "MsCommon.h"
122 #include "MsVersion.h"
123 #include "MsOS.h"
124 #include "mhal_xc_chip_config.h"
125 #include "utopia.h"
126 #include "utopia_dapi.h"
127 
128 // Internal Definition
129 #include "drvXC_IOPort.h"
130 #include "apiXC.h"
131 #include "apiXC_DWIN.h"
132 #include "apiXC_Adc.h"
133 #include "apiXC_Auto.h"
134 #include "drv_sc_display.h"
135 #include "drv_sc_isr.h"
136 #include "apiXC_PCMonitor.h"
137 #include "apiXC_ModeParse.h"
138 #include "drvXC_HDMI_if.h"
139 #include "mvideo_context.h"
140 #include "drv_sc_ip.h"
141 #if (LD_ENABLE==1)
142 #include "mdrv_ld.h"
143 #include "mdrv_ldalgo.h"
144 #endif
145 #include "mdrv_sc_3d.h"
146 #include "drv_sc_menuload.h"
147 #include "drvXC_ADC_Internal.h"
148 #include "mdrv_frc.h"
149 #include "mhal_frc.h"
150 #include "mhal_sc.h"
151 #include "mhal_dynamicscaling.h"
152 #include "XC_private.h"
153 #include "apiXC_v2.h"
154 #include "drvXC_HDMI_Internal.h"
155 
156 #include "xc_Analog_Reg.h"
157 #include "hwreg_ipmux.h"
158 
159 #include "drv_sc_scaling.h"
160 #include "drv_sc_mux.h"
161 #include "drv_sc_DIP_scaling.h"
162 #include "mdrv_sc_dynamicscaling.h"
163 #include "drvscaler_nr.h"
164 #include "drvMMIO.h"
165 #include "mhal_pip.h"
166 
167 #ifndef DISABLE_PQ_FUNCTION
168 #include "drvPQ.h"
169 #endif
170 
171 //Add for A5
172 #include "mhal_dip.h"
173 
174 // Tobe refined
175 #include "xc_hwreg_utility2.h"
176 #include "mhal_mux.h"
177 #include "mhal_hdmi.h"
178 #include "mhal_ip.h"
179 #include "mhal_sc.h"
180 #include "mhal_menuload.h"
181 
182 #ifndef DONT_USE_CMA
183 #if (XC_SUPPORT_CMA ==TRUE)
184 #ifdef MSOS_TYPE_LINUX_KERNEL
185 #include "drvCMAPool_v2.h"
186 #else
187 #include "drvCMAPool.h"
188 #endif
189 #include "msos/linux/mdrv_cma_pool_st.h"
190 #include "halCHIP.h"
191 #endif
192 #endif
193 #include "drvSYS.h"
194 
195 //mvop for xc all mvop API
196 #include "drvMVOP.h"
197 #include "tee_client_api.h"
198 #include "drvMIU.h"
199 
200 /*
201     XC_INITDATA_VERSION                      current version : 1    //1: Add an field eScartIDPort_Sel for port selection
202 */
203 
204 
205 //PQ_Function_Info    s_PQ_Function_Info = {0, 0, 0, 0, 0, 0, 0, 0, 0};
206 PQ_Function_Info    s_PQ_Function_Info[2];//MAX_XC_DEVICE_NUM // = {{0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0}};
207 
208 MS_U8 MApi_Pnl_Get_LPLL_Type(void);
209 MS_BOOL MApi_PNL_Get_TCON_Capability(void);
210 //void MApi_PNL_CalExtLPLLSETbyDClk(MS_U32 ldHz);
211 #ifdef PATCH_TCON_BRING_UP
212 const char* MDrv_PNL_GetName(void);
213 #endif
214 
215 //-------------------------------------------------------------------------------------------------
216 //  Driver Compiler Options
217 //-------------------------------------------------------------------------------------------------
218 
219 
220 //-------------------------------------------------------------------------------------------------
221 //  Local Defines
222 //-------------------------------------------------------------------------------------------------
223 
224 #define VERIFY_MVIDEO_FPGA  0
225 
226 #ifndef XC_HLINEARSCALING_VER
227 #define XC_HLINEARSCALING_VER 0
228 #endif
229 
230 #ifndef ENABLE_DI_8LB_MODE
231 #define ENABLE_DI_8LB_MODE 0
232 #endif
233 
234 #ifdef MSOS_TYPE_LINUX_KERNEL
235 #define DELAY_FRAME_NUM 5
236 #endif
237 
238 #ifdef MSOS_TYPE_OPTEE
239 #define MAX_OPTEE_ERROR_CNT 3
240 #endif
241 
242 #if defined (__aarch64__)
243 #define VERSION_COMPATIBLE_CHECK(pstInput,stValid,copy_Length,version_arg,length_arg,current_version) do { \
244     if(pstInput == NULL)\
245         return E_APIXC_RET_FAIL;\
246     /*new AP + old lib, only the length corresponding to old lib has meaning.*/\
247     if((pstInput)->version_arg > (current_version))\
248     {\
249         /*We consider compatible operation from this version, so reject the info init when version invalid*/\
250         printf("[%s: %d]: this old version XC lib has only length:%lu driver status!!\n",\
251                      __FUNCTION__, __LINE__, sizeof(stValid));\
252         /*we still copy the min size of both structure, but AP should take care of it.*/\
253         (copy_Length) = sizeof(stValid);\
254     }\
255     \
256     /*old AP + new lib, driver shouldn't access to the space which doesn't exist in old structure*/\
257     if(((pstInput)->version_arg < (current_version)) || ((pstInput)->length_arg < sizeof(stValid)))\
258     {\
259         /*We consider compatible operation from this version, so reject the info init when version invalid*/\
260         printf("[%s: %d]: new version XC lib shouldn't access to the space which doesn't exist in old structure!!\n",\
261         __FUNCTION__, __LINE__);\
262         (copy_Length) = (pstInput)->length_arg;\
263     }\
264 }while(0)
265 #else
266 #define VERSION_COMPATIBLE_CHECK(pstInput,stValid,copy_Length,version_arg,length_arg,current_version) do { \
267     if(pstInput == NULL)\
268         return E_APIXC_RET_FAIL;\
269     /*new AP + old lib, only the length corresponding to old lib has meaning.*/\
270     if((pstInput)->version_arg > (current_version))\
271     {\
272         /*We consider compatible operation from this version, so reject the info init when version invalid*/\
273         printf("[%s: %d]: this old version XC lib has only length:%u driver status!!\n",\
274                      __FUNCTION__, __LINE__, sizeof(stValid));\
275         /*we still copy the min size of both structure, but AP should take care of it.*/\
276         (copy_Length) = sizeof(stValid);\
277     }\
278     \
279     /*old AP + new lib, driver shouldn't access to the space which doesn't exist in old structure*/\
280     if(((pstInput)->version_arg < (current_version)) || ((pstInput)->length_arg < sizeof(stValid)))\
281     {\
282         /*We consider compatible operation from this version, so reject the info init when version invalid*/\
283         printf("[%s: %d]: new version XC lib shouldn't access to the space which doesn't exist in old structure!!\n",\
284         __FUNCTION__, __LINE__);\
285         (copy_Length) = (pstInput)->length_arg;\
286     }\
287 }while(0)
288 #endif
289 //#define SUPPORT_HDMI20_420
290 //-------------------------------------------------------------------------------------------------
291 //  Local Structurs
292 //-------------------------------------------------------------------------------------------------
293 
294 //-------------------------------------------------------------------------------------------------
295 //  Global Variables
296 //-------------------------------------------------------------------------------------------------
297 //-------------------------------------------------------------------------------------------------
298 //  Local Variables
299 //-------------------------------------------------------------------------------------------------
300 static MSIF_Version _api_xc_version = {
301     .DDI = { XC_API_VERSION },
302 };
303 
304 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
305 MS_U32 u32SetWindowTime;
306 #endif
307 //-------------------------------------------------------------------------------------------------
308 //  Debug Functions
309 //-------------------------------------------------------------------------------------------------
310 
311 
312 //-------------------------------------------------------------------------------------------------
313 //  Local Functions
314 //-------------------------------------------------------------------------------------------------
315 
316 
317 //-------------------------------------------------------------------------------------------------
318 //  Global Functions
319 //-------------------------------------------------------------------------------------------------
320 
MApi_XC_Enable_LockFreqOnly_U2(void * pInstance,MS_BOOL bEnable)321 E_APIXC_ReturnValue MApi_XC_Enable_LockFreqOnly_U2(void* pInstance,MS_BOOL bEnable)
322 {
323     MS_BOOL bRet = FALSE;
324 
325     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
326     UtopiaResourceGetPrivate(g_pXCResource[E_XC_POOL_ID_INTERNAL_VARIABLE],(void**)(&pXCResourcePrivate));
327 
328     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_POOL_ID_INTERNAL_VARIABLE);
329     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bEnableLockFreqOnly = bEnable;
330     bRet = TRUE;
331     _XC_SEMAPHORE_RETURN(pInstance,E_XC_POOL_ID_INTERNAL_VARIABLE);
332 
333     if (bRet)
334     {
335         return E_APIXC_RET_OK;
336     }
337     else
338     {
339         return E_APIXC_RET_FAIL;
340     }
341 }
342 
MApi_XC_Enable_LockFreqOnly(MS_BOOL bEnable)343 E_APIXC_ReturnValue MApi_XC_Enable_LockFreqOnly(MS_BOOL bEnable)
344 {
345     if (pu32XCInst == NULL)
346     {
347         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
348         return E_APIXC_RET_FAIL;
349     }
350 
351     stXC_Enable_LockFreqOnly XCArgs;
352     XCArgs.bEnable = bEnable;
353     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
354 
355     if(UtopiaIoctl(pu32XCInst, E_XC_ENABLE_LOCKFREQONLY, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
356     {
357         printf("Obtain XC engine fail\n");
358         return E_APIXC_RET_FAIL;
359     }
360     else
361     {
362         return XCArgs.eReturnValue;
363     }
364 
365 }
366 
367 #if(XC_CONTEXT_ENABLE)
368 MS_U8 _XC_Client[] = {"Linux XC driver"};
369 
_MApi_XC_Init_Context(void * pInstance,MS_BOOL * pbFirstDrvInstant)370 static MS_BOOL _MApi_XC_Init_Context(void *pInstance, MS_BOOL *pbFirstDrvInstant)
371 {
372     MS_BOOL bRet = TRUE;
373     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
374     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
375     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
376     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
377     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
378 
379     *pbFirstDrvInstant = pXCResourcePrivate->stdrvXC_MVideo.bNeedInitShared;
380 
381     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
382 
383     return bRet;
384 }
385 #endif
386 
387 //-------------------------------------------------------------------------------------------------
388 /// Exit the XC
389 /// @return @ref MS_BOOL
390 //-------------------------------------------------------------------------------------------------
MApi_XC_Exit_U2(void * pInstance)391 MS_BOOL MApi_XC_Exit_U2(void* pInstance)
392 {
393     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
394     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
395     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
396     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
397     if (_XC_Mutex == -1)
398     {
399         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
400         return TRUE;
401     }
402     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
403     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
404 
405 #if ((HW_DESIGN_4K2K_VER == 6) && FRC_INSIDE)
406         MS_U8 u8LPLL_Type =(MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
407 
408         if (IsVBY1_16LANE(u8LPLL_Type))
409         {
410             MHal_XC_PixelShiftStatusChange(pInstance, EN_XC_PIXEL_SHIFT_DISABLE);
411         }
412         // Maserati mode
413         if ((u8LPLL_Type >= E_XC_PNL_LPLL_VBY1_10BIT_16LANE)&&(u8LPLL_Type <= E_XC_PNL_LPLL_VBY1_8BIT_16LANE))
414         {
415             // case 4: no FSC + FRC
416             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
417             {
418                 _MLOAD_ENTRY(pInstance);
419             }
420             else
421             {
422                 printf("mload is not enable, please check !\n");
423             }
424             MHal_FRC_Set_Pipe_Delay_Reset(pInstance, DISABLE, TRUE);
425 
426             MHal_FRC_ByPass_Enable(pInstance, FALSE);  // enable FRC
427             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_1, TRUE);
428 
429             MHal_FRC_Set_Composer_User_Mode(pInstance, E_FRC_COMPOSER_SOURCE_MODE_VIP, TRUE);
430             MHal_FRC_Set_FSC_DE_Selection(pInstance, E_FRC_FSC_SOURCE_MODE_MDE);
431             MHal_FRC_TGEN_Enable_Lock_Source(pInstance, DISABLE, E_FRC_TGEN_LOCK_SOURCE_MODE_FROM_TGEN, TRUE);
432             MDrv_XC_MLoad_Fire(pInstance, TRUE);
433             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
434             {
435                 _MLOAD_RETURN(pInstance);
436             }
437             else
438             {
439                 printf("mload is not enable, please check !\n");
440             }
441             pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
442             pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = TRUE;
443         }
444         else
445         {
446             // For Manhattan mode
447             // no FSC+ no FRC
448             pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
449             pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
450             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
451             {
452                 _MLOAD_ENTRY(pInstance);
453             }
454             else
455             {
456                 printf("mload is not enable, please check !\n");
457             }
458             MHal_FRC_Set_Pipe_Delay_Reset(pInstance, DISABLE, TRUE);
459             MHal_FRC_AdjustGOPPosition(pInstance);
460             MHal_FRC_ByPass_Enable(pInstance, TRUE); // disable FRC
461             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_1, TRUE);
462 
463             MHal_FRC_Set_Composer_User_Mode(pInstance, E_FRC_COMPOSER_SOURCE_MODE_VIP, TRUE);
464             MHal_FRC_Set_FSC_DE_Selection(pInstance, E_FRC_FSC_SOURCE_MODE_MDE);
465             MHal_FRC_TGEN_Enable_Lock_Source(pInstance, DISABLE, E_FRC_TGEN_LOCK_SOURCE_MODE_FROM_TGEN, TRUE);
466             MDrv_XC_MLoad_Fire(pInstance, TRUE);
467             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
468             {
469                 _MLOAD_RETURN(pInstance);
470             }
471             else
472             {
473                 printf("mload is not enable, please check !\n");
474             }
475         }
476 #endif
477     _XC_ENTRY(pInstance);
478 #ifdef K3_U2
479     if(psXCInstPri->u32DeviceID == E_XC_DEVICE0)
480     {
481         if(pXCResourcePrivate->stdrvXC_MVideo._stXC_ApiInfo.u8MaxWindowNum > 1)
482         {
483             // DISABLE FIClk1
484             MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, CKG_FICLK_F1_GATED);                // Enable clock
485 
486             // DISABLE IDClk1
487             MDrv_WriteRegBit(REG_CKG_IDCLK1, ENABLE, CKG_IDCLK1_GATED);
488 
489             // DISABLE SIDClk1
490             MDrv_WriteRegBit(REG_CKG_SIDCLK1, ENABLE, CKG_SIDCLK1_GATED);
491         }
492 
493         // DISABLE FIClk2
494         MDrv_WriteRegBit(REG_CKG_FICLK_F2, ENABLE, CKG_FICLK_F2_GATED);                    // Enable clock
495 
496         // DISABLE FClk
497         MDrv_WriteRegBit(REG_CKG_FCLK, ENABLE, CKG_FCLK_GATED);                            // Enable clock
498 
499         // DISABLE IDClk2
500         MDrv_WriteRegBit(REG_CKG_IDCLK2, ENABLE, CKG_IDCLK2_GATED);                        // Enable clock
501 
502         // DISABLE SIDClk2
503         MDrv_WriteRegBit(REG_CKG_SIDCLK2, ENABLE, CKG_SIDCLK2_GATED);
504     }
505     else // pDeviceId->u32Id == E_XC_DEVICE1
506     {
507         // DISABLE FIClk2
508         MDrv_WriteRegBit(REG_CKG_SC1_FECLK_F2, ENABLE, CKG_SC1_FECLK_F2_GATED);                    // Enable clock
509 
510         // DISABLE FClk
511         MDrv_WriteRegBit(REG_CKG_SC1_FCLK, ENABLE, CKG_SC1_FCLK_GATED);                            // Enable clock
512 
513         // DISABLE IDClk2
514         MDrv_WriteRegBit(REG_CKG_SC1_IDCLK2, ENABLE, CKG_SC1_IDCLK2_GATED);                        // Enable clock
515 
516         // DISABLE SIDClk2
517         MDrv_WriteRegBit(REG_CKG_SC1_SIDCLK2, ENABLE, CKG_SC1_SIDCLK2_GATED);
518     }
519 #else
520 
521 #if(HW_DESIGN_4K2K_VER == 4)
522     if(psXCInstPri->u32DeviceID == E_XC_DEVICE0)
523     {
524         if(pXCResourcePrivate->stdrvXC_MVideo._stXC_ApiInfo.u8MaxWindowNum > 1)
525         {
526             // DISABLE FIClk1
527             MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, CKG_FICLK_F1_GATED);                // Enable clock
528 
529             // DISABLE IDClk1
530             MDrv_WriteRegBit(REG_CKG_IDCLK1, ENABLE, CKG_IDCLK1_GATED);
531         }
532 
533             // DISABLE EDCLK_F2
534         Hal_SC_set_edclk(pInstance, 0x00, DISABLE, MAIN_WINDOW);
535             // DISABLE EDCLK_F1
536         Hal_SC_set_edclk(pInstance, 0x00, DISABLE, SUB_WINDOW);
537 
538         // DISABLE FICLK2_F2
539         Hal_SC_set_ficlk2(pInstance, 0x00, DISABLE, MAIN_WINDOW);
540 
541         // DISABLE FIClk_F2
542         MDrv_WriteRegBit(REG_CKG_FICLK_F2, ENABLE, CKG_FICLK_F2_GATED);                    // Enable clock
543 
544         // DISABLE FClk
545         MDrv_WriteRegBit(REG_CKG_FCLK, ENABLE, CKG_FCLK_GATED);                            // Enable clock
546 
547         // DISABLE IDClk2
548         MDrv_WriteRegBit(REG_CKG_IDCLK2, ENABLE, CKG_IDCLK2_GATED);                        // Enable clock
549     }
550     else
551     {
552 #ifdef MONACO_SC2_PATCH
553         // DISABLE FIClk_F2
554         MDrv_WriteRegBit(REG_CKG_S2_FICLK2_F2, ENABLE, CKG_FICLK2_F2_GATED);                    // Enable clock
555 #endif
556         // DISABLE FClk
557         MDrv_WriteRegBit(REG_CKG_S2_FCLK, ENABLE, CKG_S2_FCLK_GATED);                            // Enable clock
558 
559         // DISABLE IDClk2
560         MDrv_WriteRegBit(REG_CKG_S2_IDCLK2, ENABLE, CKG_S2_IDCLK2_GATED);                        // Enable clock
561 
562     }
563 #else
564     if(pXCResourcePrivate->stdrvXC_MVideo._stXC_ApiInfo.u8MaxWindowNum > 1)
565     {
566         // DISABLE FIClk1
567         MDrv_WriteRegBit(REG_CKG_FICLK_F1, ENABLE, CKG_FICLK_F1_GATED);                // Enable clock
568 
569         // DISABLE IDClk1
570         MDrv_WriteRegBit(REG_CKG_IDCLK1, ENABLE, CKG_IDCLK1_GATED);
571     }
572 
573         // DISABLE EDCLK_F2
574     Hal_SC_set_edclk(pInstance, 0x00, DISABLE, MAIN_WINDOW);
575         // DISABLE EDCLK_F1
576     Hal_SC_set_edclk(pInstance, 0x00, DISABLE, SUB_WINDOW);
577 
578     // DISABLE FICLK2_F2
579     Hal_SC_set_ficlk2(pInstance, 0x00, DISABLE, MAIN_WINDOW);
580 
581     // DISABLE FIClk_F2
582     MDrv_WriteRegBit(REG_CKG_FICLK_F2, ENABLE, CKG_FICLK_F2_GATED);                    // Enable clock
583 
584     // DISABLE FClk
585     MDrv_WriteRegBit(REG_CKG_FCLK, ENABLE, CKG_FCLK_GATED);                            // Enable clock
586 
587     // DISABLE IDClk2
588     MDrv_WriteRegBit(REG_CKG_IDCLK2, ENABLE, CKG_IDCLK2_GATED);                        // Enable clock
589 #endif
590 #endif
591     _XC_RETURN(pInstance);
592 
593 //DISABLE Interrupt
594 #ifndef MSOS_TYPE_LINUX_KERNEL
595     if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
596     {
597         MsOS_DisableInterrupt(E_INT_IRQ_DISP);
598     }
599     else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
600     {
601         MsOS_DisableInterrupt(E_INT_IRQ_EC_BRIDGE);
602         MsOS_DisableInterrupt(E_INT_IRQ_DISP1);
603     }
604 #endif
605 
606     // Release ISR
607     if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
608     {
609         MsOS_DetachInterrupt(E_INT_IRQ_DISP);
610     }
611     else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
612     {
613         MsOS_DetachInterrupt(E_INT_IRQ_EC_BRIDGE);
614         MsOS_DetachInterrupt(E_INT_IRQ_DISP1);
615     }
616 
617     // Clear internal variable
618     mvideo_sc_variable_init(pInstance, TRUE, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData);
619 
620     _XC_ENTRY(pInstance);
621     memset(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, 0 , sizeof(XC_INITDATA) );
622 
623     #if 0 //(FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
624     MHal_XC_FRCR2_IP_PatchClose(pInstance, MAIN_WINDOW);
625     MHal_XC_FRCR2_OP_PatchClose(pInstance, MAIN_WINDOW);
626     #endif
627 
628     _XC_RETURN(pInstance);
629     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
630     // For XC re-init
631     MsOS_DeleteMutex(_XC_Mutex);
632     _XC_Mutex = -1;
633 
634     MsOS_DeleteMutex(_XC_ISR_Mutex);
635     _XC_ISR_Mutex = -1;
636 #ifndef DONT_USE_CMA
637 #if (XC_SUPPORT_CMA ==TRUE)
638 #if (HW_DESIGN_4K2K_VER == 7)
639     if(psXCInstPri->u32DeviceID == 0)
640 #endif
641     {
642         if ((pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == TRUE) ||
643             (pXCResourcePrivate->sthal_Optee.op_tee_xc[SUB_WINDOW].isEnable == TRUE))
644         {
645             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
646             return TRUE;
647         }
648         MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
649         MApi_CMA_Pool_Release(gSrcInfo[MAIN_WINDOW].Status2.stXCConfigCMA[CMA_XC_SELF_MEM].u32HeapID);
650         if (gSrcInfo[MAIN_WINDOW].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID)
651         {
652             MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
653             MApi_CMA_Pool_Release(gSrcInfo[MAIN_WINDOW].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID);
654         }
655     }
656 #endif
657 #endif
658     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
659     return TRUE;
660 
661 }
662 
MApi_XC_Exit(void)663 MS_BOOL MApi_XC_Exit(void)
664 {
665 
666     if (pu32XCInst == NULL)
667     {
668         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
669         return FALSE;
670     }
671 
672     stXC_EXIT XCArgs;
673     XCArgs.bReturnValue = FALSE;
674 
675     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_EXIT, (void*)&XCArgs) != 0)
676     {
677         printf("Obtain XC engine fail\n");
678         return FALSE;
679     }
680     else
681     {
682         return XCArgs.bReturnValue;
683     }
684 }
685 
MDrv_XC_IsPNLYUVOutput(void * pInstance)686 MS_BOOL MDrv_XC_IsPNLYUVOutput(void *pInstance)
687 {
688     //Pnl output is affected by input signal, so change to xc driver to report it as below
689     return MHal_XC_IsPNLYUVOutput(pInstance);
690 }
691 
MDrv_XC_Is2K2KToFrc(void * pInstance)692 MS_BOOL MDrv_XC_Is2K2KToFrc(void *pInstance)
693 {
694     MS_BOOL bRet = FALSE;
695     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
696     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
697     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
698     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
699 #if FRC_INSIDE
700     // For Einstein FRC 4K2K case, for non-4K2K input, need to sent 2Kx2K to FRC
701     if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
702         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
703         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500) &&  // 4K2K 60 out
704         (pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_2K1K))
705     {
706         bRet = TRUE;
707     }
708 #endif
709     return bRet;
710 }
711 
MDrv_XC_SetIOMapBase_i(void * pInstance)712 MS_BOOL MDrv_XC_SetIOMapBase_i(void* pInstance)
713 {
714     MS_VIRT _XCRIUBaseAddress = 0, _PMRIUBaseAddress = 0;
715     MS_PHY u32NonPMBankSize = 0, u32PMBankSize = 0;
716     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
717 
718 
719     if(MDrv_MMIO_GetBASE( &_XCRIUBaseAddress, &u32NonPMBankSize, MS_MODULE_XC ) != TRUE)
720     {
721         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Init GetBASE failure\n");
722         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
723         return FALSE;
724     }
725     else
726     {
727         //printf("MApi_XC_Init GetBase success %lx\n", _XCRIUBaseAddress);
728     }
729 
730     if(MDrv_MMIO_GetBASE( &_PMRIUBaseAddress, &u32PMBankSize, MS_MODULE_PM ) != TRUE)
731     {
732         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Init Get PM BASE failure\n");
733         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
734         return FALSE;
735     }
736     else
737     {
738         //printf("MApi_XC_Init GetPMBase success %lx\n", _PMRIUBaseAddress);
739     }
740     //printf("XC RIU base=%lx\n", _XCRIUBaseAddress);
741     MDrv_XC_init_riu_base(_XCRIUBaseAddress, _PMRIUBaseAddress);
742     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
743     return TRUE;
744 }
745 
746 //This API only designed for DFB calling.
747 //Supernova involved xc lib only by initializing this function.
748 //So we need to create mutext in this API.
749 //it's useless for new dfb-xc design
MDrv_XC_SetIOMapBase_U2(void * pInstance)750 MS_BOOL MDrv_XC_SetIOMapBase_U2(void* pInstance)
751 {
752     MS_BOOL bReturn = FALSE;
753     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
754     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
755     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
756 
757     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
758     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
759     pXCResourcePrivate->stdrvXC_MVideo._bDFBInit = TRUE; //This flag is to compatible old dfb version.
760                       //new dfb will not call this func,
761                       //instead of set u32InitDataLen=0 of MApi_XC_Init()
762     printf("MDrv_XC_SetIOMapBase(), do nothing, it's assumed DFB init case!\n");
763     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
764     return bReturn;
765 }
MDrv_XC_SetIOMapBase(void)766 MS_BOOL MDrv_XC_SetIOMapBase(void)
767 {
768     if (pu32XCInst == NULL)
769     {
770         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
771         return FALSE;
772     }
773 
774     stXC_CMD_SET_IOMAPBASE XCArgs;
775     XCArgs.bReturnValue = FALSE;
776 
777     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_IOMAPBASE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
778     {
779         printf("Obtain XC engine fail\n");
780         return FALSE;
781     }
782     else
783     {
784         return XCArgs.bReturnValue;
785     }
786 }
787 
MApi_XC_PreInit_FRC(void * pInstance,XC_PREINIT_INFO_t * pPanelInfo)788 void MApi_XC_PreInit_FRC(void *pInstance, XC_PREINIT_INFO_t *pPanelInfo)
789 {
790     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
791     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
792     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
793 
794     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
795     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
796     ///patch
797     ///g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType = E_XC_3D_PANEL_SHUTTER;
798     memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc, pPanelInfo, sizeof(XC_PREINIT_INFO_t));
799     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
800 }
801 
MApi_XC_PreInit_U2(void * pInstance,E_XC_PREINIT_t eType,void * para,MS_U32 u32Length)802 E_APIXC_ReturnValue MApi_XC_PreInit_U2( void* pInstance, E_XC_PREINIT_t eType ,void* para, MS_U32 u32Length)
803 {
804     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
805     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
806     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
807     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
808     XC_PREINIT_INFO_t* stFRCInfo = NULL;
809 
810     switch(eType)
811     {
812         case E_XC_PREINIT_FRC:
813             if(u32Length != sizeof(XC_PREINIT_INFO_t))
814             {
815                 printf("Error size of parameters\n");
816                 return E_APIXC_RET_FAIL;
817             }
818             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
819             MApi_XC_PreInit_FRC(pInstance, (XC_PREINIT_INFO_t *)para);
820             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
821         break;
822         case E_XC_PREINIT_FRC_3D_TYPE:
823             if(u32Length != sizeof(XC_PREINIT_INFO_t))
824             {
825                 printf("Error size of parameters\n");
826                 return E_APIXC_RET_FAIL;
827             }
828             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
829             UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
830             stFRCInfo = (XC_PREINIT_INFO_t *)para;
831             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8FRC3DPanelType = stFRCInfo->FRCInfo.u8FRC3DPanelType;
832             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
833         break;
834         case E_XC_PREINIT_FRC_ADDRESS:
835             if(u32Length != sizeof(XC_FRC_ADDRESS_INFO))
836             {
837                 printf("Error size of parameters\n");
838                 return E_APIXC_RET_FAIL;
839             }
840             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
841             MDrv_FRC_SetMemoryAddress(pInstance, (XC_FRC_ADDRESS_INFO *)para);
842             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
843         break;
844         case E_XC_PREINIT_HDMITX_COLORDEPTH:
845             #if (HW_DESIGN_HDMITX_VER == 2)
846             if(u32Length != sizeof(EN_XC_HDMITX_COLORDEPTH))
847             {
848                 printf("Error size of parameters\n");
849                 return E_APIXC_RET_FAIL;
850             }
851             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
852             UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
853             pXCResourcePrivate->stdrvXC_MVideo_Context.enHDMITXColorDepth = *(EN_XC_HDMITX_COLORDEPTH *)para;
854             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
855             #else
856             printf("Not support assign color depth for HDMI Tx \n");
857             return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
858             #endif
859         break;
860         default:
861         case E_XC_PREINIT_NULL:
862 
863         break;
864     }
865     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
866     return E_APIXC_RET_OK;
867 }
868 
MApi_XC_PreInit(E_XC_PREINIT_t eType,void * para,MS_U32 u32Length)869 E_APIXC_ReturnValue MApi_XC_PreInit( E_XC_PREINIT_t eType ,void* para, MS_U32 u32Length)
870 {
871     if (pu32XCInst == NULL)
872     {
873         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
874         {
875             printf("UtopiaOpen XC failed\n");
876             return E_APIXC_RET_FAIL;
877         }
878     }
879 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
880      if (pu32XCInst_1 == NULL)
881      {
882         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
883         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
884         stXCInstantAttribute.u32DeviceID = 1;
885         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
886         {
887             printf("UtopiaOpen XC failed\n");
888             return E_APIXC_RET_FAIL;
889         }
890       }
891 #endif
892     stXC_PREINIT XCArgs;
893     XCArgs.eType = eType;
894     XCArgs.para = para;
895     XCArgs.u32Length = u32Length;
896     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
897 
898     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_PREINIT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
899     {
900         printf("Obtain XC engine fail\n");
901         return E_APIXC_RET_FAIL;
902     }
903     else
904     {
905         return XCArgs.eReturnValue;
906     }
907 }
908 
_MApi_XC_Init_WithoutCreateMutex(void * pInstance,XC_INITDATA * pXC_InitData,MS_U32 u32InitDataLen)909 static MS_BOOL _MApi_XC_Init_WithoutCreateMutex(void *pInstance, XC_INITDATA *pXC_InitData, MS_U32 u32InitDataLen)
910 {
911     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
912     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
913     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
914 
915     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
916 
917     pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange = 0;
918     if(pXCResourcePrivate->stdrvXC_MVideo._bSkipSWReset == FALSE)
919     {
920         _XC_ENTRY(pInstance);
921         MDrv_SC_SetSkipWaitVsync(pInstance, MAIN_WINDOW, TRUE);
922         MDrv_SC_SetSkipWaitVsync(pInstance, SUB_WINDOW , TRUE);
923         MDrv_XC_SoftwareReset(pInstance, REST_IP_ALL, MAIN_WINDOW);
924 
925         // adc init
926         MDrv_ADC_init(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32XTAL_Clock/1000UL
927                       ,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.bIsShareGround
928                       ,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.eScartIDPort_Sel);
929 
930         //mvop init
931         //MBoot can not init MVOP here(MBoot does not register MVOP)
932 #if (!(defined(CONFIG_MBOOT)) && !(defined(MSOS_TYPE_OPTEE)))
933         MDrv_MVOP_Init();
934 #endif
935 
936         Hal_SC_enable_window(pInstance, FALSE,SUB_WINDOW);
937 
938         MDrv_XC_DisableInputSource(pInstance, ENABLE, MAIN_WINDOW);
939         MDrv_XC_DisableInputSource(pInstance, ENABLE, SUB_WINDOW);
940 #if 0
941 #ifndef DONT_USE_CMA
942 #if (XC_SUPPORT_CMA ==TRUE)
943         MS_BOOL ret= FALSE;
944 
945         if (
946 #if (HW_DESIGN_4K2K_VER == 7)
947             (psXCInstPri->u32DeviceID == 0) &&
948 #endif
949             pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState != E_POWER_SUSPEND)
950         {
951 #if (HW_DESIGN_4K2K_VER == 6)
952             gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_SELF_MEM].u32HeapID = ION_XC_HEAP_ID;
953 #if defined(CHIP_MONET)
954             gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID = XC_DUAL_MIU_HID;
955 #else
956             gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID = XC_INVALID_HEAP_ID;
957 #endif
958             gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_SELF_MEM].u64AddrHeapOffset = 0;
959             gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u64AddrHeapOffset = 0;
960 #endif
961             /* 1. do CMA_POOL_INIT */
962             CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_id     = gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_SELF_MEM].u32HeapID;
963             CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].flags       = CMA_FLAG_MAP_VMA;
964             MsOS_DelayTaskUs(1);
965             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], CMA self heapid = %d!\n",__func__, __LINE__,CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_id);
966 
967             ret = MApi_CMA_Pool_Init(&CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM]);
968 
969             if(ret == FALSE)
970             {
971                 printf("\033[35m   Function = %s, Line = %d, CMA_POOL_INIT ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__);
972                 while(1);
973                 ////assert(0);
974             }
975             else
976             {
977                 //printf("\033[35m  Function = %s, Line = %d, get pool_handle_id is %u\033[m\n", __PRETTY_FUNCTION__, __LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].pool_handle_id);
978                 //printf("\033[35m  Function = %s, Line = %d, get miu is %u\033[m\n", __PRETTY_FUNCTION__,__LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].miu);
979                 //printf("\033[35m  Function = %s, Line = %d, get heap_miu_start_offset is 0x%lx\033[m\n", __PRETTY_FUNCTION__, __LINE__, (MS_U32)CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_miu_start_offset);
980                 //printf("\033[35m  Function = %s, Line = %d, get heap_length is 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_length);
981             }
982 
983             if (gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID)
984             {
985                 /* 1. do CMA_POOL_INIT */
986                 CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM].heap_id     = gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID;
987                 CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM].flags       = CMA_FLAG_MAP_VMA;
988                 MsOS_DelayTaskUs(1);
989                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], CMA cobuff heapid = %d!\n",__func__, __LINE__,CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM].heap_id);
990                 ret = MApi_CMA_Pool_Init(&CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM]);
991 
992                 if(ret == FALSE)
993                 {
994                     printf("\033[35m   Function = %s, Line = %d, CMA_POOL_INIT ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__);
995                     while(1);
996                     //assert(0);
997                 }
998                 else
999                 {
1000                     //printf("\033[35m  Function = %s, Line = %d, get pool_handle_id is %u\033[m\n", __PRETTY_FUNCTION__, __LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].pool_handle_id);
1001                     //printf("\033[35m  Function = %s, Line = %d, get miu is %u\033[m\n", __PRETTY_FUNCTION__,__LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].miu);
1002                     //printf("\033[35m  Function = %s, Line = %d, get heap_miu_start_offset is 0x%lx\033[m\n", __PRETTY_FUNCTION__, __LINE__, (MS_U32)CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_miu_start_offset);
1003                     //printf("\033[35m  Function = %s, Line = %d, get heap_length is 0x%X\033[m\n", __PRETTY_FUNCTION__, __LINE__, CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM].heap_length);
1004                 }
1005             }
1006         }
1007 #endif
1008 #endif
1009 #endif
1010 
1011         // default frame buffer address init
1012         MDrv_XC_SetFrameBufferAddress(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr,
1013                                       pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size, MAIN_WINDOW);
1014         MDrv_XC_SetFrameBufferAddress(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr,
1015                                       pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size, SUB_WINDOW);
1016         // default frcm frame buffer address init
1017         MDrv_XC_SetFRCMFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Start_Addr,
1018                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Size, MAIN_WINDOW);
1019         MDrv_XC_SetFRCMFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Start_Addr,
1020                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Size, SUB_WINDOW);
1021         //Monet default use cma, this will be opened for no cma dual case
1022 #if 0//def UFO_XC_SUPPORT_DUAL_MIU
1023         // default dual frame buffer address init
1024         MDrv_XC_SetDualFrameBufferAddress(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Dual_FB_Start_Addr[MAIN_WINDOW],
1025                                       pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Dual_FB_Size[MAIN_WINDOW], MAIN_WINDOW);
1026         MDrv_XC_SetDualFrameBufferAddress(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Dual_FB_Start_Addr[SUB_WINDOW],
1027                                       pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Dual_FB_Size[SUB_WINDOW], SUB_WINDOW);
1028 #endif
1029         MDrv_XC_init_fbn_win(pInstance, MAIN_WINDOW);
1030         MDrv_XC_init_fbn_win(pInstance, SUB_WINDOW);
1031 
1032         if (pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState != E_POWER_RESUME)
1033         {
1034             // in MApi_XC_SetPowerState_U2 function will set mcdi,so here is not needed
1035             //HW initial settting of MCDi is turned on (the address of MCDi is 0).
1036             //Driver should turn it off before Fclk on, otherwise it will start write whole memory.
1037             MDrv_SC_EnableMCDI(pInstance, DISABLE,E_XC_MCDI_BOTH); // Main Window
1038             MDrv_SC_EnableMCDI(pInstance, DISABLE,E_XC_MCDI_SUB_BOTH); // Sub Window
1039         }
1040         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.bEnableIPAutoCoast)
1041         {
1042             // enable IP auto coast
1043             MDrv_XC_EnableIPAutoCoast(pInstance, ENABLE);
1044         }
1045 
1046         /**
1047             * !!! Attention !!! The ISR interface is different from Chakra2 and Utopia.
1048             * In Chakra2, there are two para needed, MHAL_SavedRegisters and vector.
1049             * In Utopia, there is no parameter.
1050             */
1051         if((pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState == E_POWER_MECHANICAL)
1052 #if 0
1053 #ifndef MSOS_TYPE_LINUX_KERNEL
1054         || (pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState == E_POWER_SUSPEND)
1055 #endif
1056 #endif
1057         )
1058         {
1059 #ifdef MSOS_TYPE_LINUX_KERNEL
1060             if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1061             {
1062                 MsOS_AttachInterrupt_Shared(E_INT_IRQ_DISP,(InterruptCb) MDrv_SC_isr);
1063             }
1064             else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1065             {
1066                 MsOS_AttachInterrupt_Shared(E_INT_IRQ_DISP1,(InterruptCb) MDrv_SC1_isr);
1067             }
1068 #else
1069             if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1070             {
1071                 MsOS_AttachInterrupt(E_INT_IRQ_DISP,(InterruptCb) MDrv_SC_isr);
1072             }
1073             else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1074             {
1075                 MsOS_AttachInterrupt(E_INT_IRQ_DISP1,(InterruptCb) MDrv_SC1_isr);
1076             }
1077 #endif
1078         }
1079         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1080         {
1081             MsOS_EnableInterrupt(E_INT_IRQ_DISP);
1082         }
1083         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1084         {
1085             MsOS_EnableInterrupt(E_INT_IRQ_DISP1);
1086         }
1087 
1088 
1089         // Enable XC interrupts
1090         //MDrv_WriteByte(BK_SELECT_00, REG_BANK_VOP);
1091         //MDrv_WriteRegBit(L_BK_VOP(0x25), ENABLE, BIT(7));
1092         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_25_L, 0x80, BIT(7));
1093 
1094         // Daten FixMe, move from panel init to here, need to check why
1095         //MDrv_WriteByte(BK_SELECT_00, REG_BANK_S_VOP);
1096         //MDrv_WriteRegBit(L_BK_S_VOP(0x56), 1, BIT(1));  //Using new ovs_ref
1097         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_56_L, 0x02, BIT(1));
1098 
1099         //MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
1100         //MDrv_WriteByteMask(L_BK_IP1F2(0x09), 0x02, BIT(3) | BIT(2) | BIT(1) | BIT(0));  //YLock
1101         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_09_L, 0x02, BIT(3) | BIT(2) | BIT(1) | BIT(0));
1102         //Extend the pixel of bottom A session at the right side [7:0]
1103         //Extend the pixel of bottom B session at the left side[15:8] for PIP issue
1104         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_14_L, 0x2020);
1105 
1106         //HSYNC Tolerance for Mode Change
1107         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_1D_L, 0x02, 0x1F);
1108 
1109         //----------------------------
1110         // Enable clock
1111         //----------------------------
1112 
1113         // Enable sub window clock
1114 #if 0
1115         if(_stXC_ApiInfo.u8MaxWindowNum > 1)
1116         {
1117             // Enable FIClk1
1118             MDrv_WriteByteMask(REG_CKG_FICLK_F1, CKG_FICLK_F1_FLK, CKG_FICLK_F1_MASK);      // select FClk first, if pre-scaling down -> change to CKG_FICLK_F1_IDCLK1
1119             MDrv_WriteRegBit(REG_CKG_FICLK_F1, DISABLE, CKG_FICLK_F1_INVERT);               // Not Invert
1120             MDrv_WriteRegBit(REG_CKG_FICLK_F1, DISABLE, CKG_FICLK_F1_GATED);                // Enable clock
1121 
1122             // Enable IDClk1
1123             MDrv_WriteByteMask(REG_CKG_IDCLK1, CKG_IDCLK1_XTAL, CKG_IDCLK1_MASK);           // initial to XTAL first, will be changed when switch input source
1124             MDrv_WriteRegBit(REG_CKG_IDCLK1, DISABLE, CKG_IDCLK1_INVERT);                   // Not Invert
1125             MDrv_WriteRegBit(REG_CKG_IDCLK1, DISABLE, CKG_IDCLK1_GATED);                    // Enable clock
1126         }
1127 #endif
1128 #ifdef K3_U2
1129         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1130         {
1131             // Enable FIClk2
1132             MDrv_WriteByteMask(REG_CKG_FICLK_F2, CKG_FICLK_F2_FLK, CKG_FICLK_F2_MASK);          // select FClk first, if pre-scaling down -> change to CKG_FICLK_F1_IDCLK2
1133             MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_INVERT);                   // Not Invert
1134             MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_GATED);                    // Enable clock
1135 
1136             // Enable FClk
1137             MDrv_WriteByteMask(REG_CKG_FCLK, CKG_FCLK_170MHZ, CKG_FCLK_MASK);                   // select 170MHz, if not enough (for example, scaling bandwidth not enough), increase this
1138             MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_INVERT);                           // Not Invert
1139             MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_GATED);                            // Enable clock
1140 
1141             // Enable IDClk2
1142             MDrv_WriteByteMask(REG_CKG_IDCLK2, CKG_IDCLK2_XTAL, CKG_IDCLK2_MASK);               // initial to XTAL first, will be changed when switch input source
1143             MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_INVERT);                       // Not Invert
1144             MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_GATED);                        // Enable clock
1145 
1146             // Enable SIDClk2
1147             MDrv_WriteRegBit(REG_CKG_SIDCLK2, DISABLE, CKG_SIDCLK2_INVERT);
1148             MDrv_WriteRegBit(REG_CKG_SIDCLK2, DISABLE, CKG_SIDCLK2_GATED);
1149         }
1150         else //E_XC_DEVICE1 == pDeviceId->u32Id
1151         {
1152             // Enable FIClk2
1153             MDrv_WriteByteMask(REG_CKG_SC1_FECLK_F2, CKG_SC1_FECLK_F2_SC1_FCLK, CKG_SC1_FECLK_F2_MASK);          // select FClk first, if pre-scaling down -> change to CKG_FICLK_F1_IDCLK2
1154             MDrv_WriteRegBit(REG_CKG_SC1_FECLK_F2, DISABLE, CKG_SC1_FECLK_F2_INVERT);                   // Not Invert
1155             MDrv_WriteRegBit(REG_CKG_SC1_FECLK_F2, DISABLE, CKG_SC1_FECLK_F2_GATED);                    // Enable clock
1156 
1157             // Enable FClk
1158             MDrv_WriteByteMask(REG_CKG_SC1_FCLK, CKG_SC1_FCLK_123MHZ, CKG_SC1_FCLK_MASK);                   // select 170MHz, if not enough (for example, scaling bandwidth not enough), increase this
1159             MDrv_WriteRegBit(REG_CKG_SC1_FCLK, DISABLE, CKG_SC1_FCLK_INVERT);                           // Not Invert
1160             MDrv_WriteRegBit(REG_CKG_SC1_FCLK, DISABLE, CKG_SC1_FCLK_GATED);                            // Enable clock
1161 
1162             // Enable IDClk2
1163             MDrv_WriteByteMask(REG_CKG_SC1_IDCLK2, CKG_SC1_IDCLK2_XTAL, CKG_SC1_IDCLK2_MASK);               // initial to XTAL first, will be changed when switch input source
1164             MDrv_WriteRegBit(REG_CKG_SC1_IDCLK2, DISABLE, CKG_SC1_IDCLK2_INVERT);                       // Not Invert
1165             MDrv_WriteRegBit(REG_CKG_SC1_IDCLK2, DISABLE, CKG_SC1_IDCLK2_GATED);                        // Enable clock
1166             MDrv_Write2ByteMask(REG_CKG_SC1_FECLK2_F2, CKG_SC1_FECLK2_F2_SC1_FCLK, CKG_SC1_FECLK2_F2_MASK);  // enable ficlk2_f2
1167 
1168             // Enable SIDClk2
1169             MDrv_WriteRegBit(REG_CKG_SC1_SIDCLK2, DISABLE, CKG_SC1_SIDCLK2_INVERT);
1170             MDrv_WriteRegBit(REG_CKG_SC1_SIDCLK2, DISABLE, CKG_SC1_SIDCLK2_GATED);
1171         }
1172 #else
1173 
1174 #if(HW_DESIGN_4K2K_VER == 7)
1175         // Enable FIClk2
1176         MDrv_WriteByteMask(REG_CKG_FICLK_F2, CKG_FICLK_F2_FLK, CKG_FICLK_F2_MASK);          // select FClk first, if pre-scaling down -> change to CKG_FICLK_F1_IDCLK2
1177         MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_INVERT);                   // Not Invert
1178         MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_GATED);                    // Enable clock
1179 
1180         // Enable FClk
1181         MDrv_WriteByteMask(REG_CKG_FCLK, CKG_FCLK_DEFAULT, CKG_FCLK_MASK);                   // select 170MHz, if not enough (for example, scaling bandwidth not enough), increase this
1182         MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_INVERT);                           // Not Invert
1183         MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_GATED);                            // Enable clock
1184 
1185         // Enable IDClk2
1186         MDrv_WriteByteMask(REG_CKG_IDCLK2, CKG_IDCLK2_XTAL, CKG_IDCLK2_MASK);               // initial to XTAL first, will be changed when switch input source
1187         MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_INVERT);                       // Not Invert
1188         MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_GATED);                        // Enable clock
1189 
1190         // Enable EDClk
1191         Hal_SC_set_edclk(pInstance, CKG_EDCLK_F2_345MHZ, ENABLE, MAIN_WINDOW);
1192         Hal_SC_set_edclk(pInstance, CKG_EDCLK_F1_345MHZ, ENABLE, SUB_WINDOW);
1193 
1194         // Enable FMClk
1195         Hal_SC_set_fmclk(psXCInstPri, ENABLE);
1196 
1197         // Enable FIClk2_f2
1198         Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_FCLK, ENABLE, MAIN_WINDOW);
1199 
1200         //Enable ODCLK
1201         MDrv_WriteRegBit(REG_CKG_ODCLK, DISABLE, CKG_ODCLK_INVERT);                       // Not Invert
1202         MDrv_WriteRegBit(REG_CKG_ODCLK, DISABLE, CKG_ODCLK_GATED);
1203 #else
1204 
1205 #if(HW_DESIGN_4K2K_VER == 4 || HW_DESIGN_4K2K_VER == 6)
1206         if(psXCInstPri->u32DeviceID == E_XC_DEVICE0)
1207 #endif
1208         {
1209             // Enable FIClk2
1210             MDrv_WriteByteMask(REG_CKG_FICLK_F2, CKG_FICLK_F2_FLK, CKG_FICLK_F2_MASK);          // select FClk first, if pre-scaling down -> change to CKG_FICLK_F1_IDCLK2
1211             MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_INVERT);                   // Not Invert
1212             MDrv_WriteRegBit(REG_CKG_FICLK_F2, DISABLE, CKG_FICLK_F2_GATED);                    // Enable clock
1213 
1214             // Enable FClk
1215             MDrv_WriteByteMask(REG_CKG_FCLK, CKG_FCLK_DEFAULT, CKG_FCLK_MASK);                   // select 170MHz, if not enough (for example, scaling bandwidth not enough), increase this
1216             MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_INVERT);                           // Not Invert
1217             MDrv_WriteRegBit(REG_CKG_FCLK, DISABLE, CKG_FCLK_GATED);                            // Enable clock
1218 
1219             // Enable IDClk2
1220             MDrv_WriteByteMask(REG_CKG_IDCLK2, CKG_IDCLK2_XTAL, CKG_IDCLK2_MASK);               // initial to XTAL first, will be changed when switch input source
1221             MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_INVERT);                       // Not Invert
1222             MDrv_WriteRegBit(REG_CKG_IDCLK2, DISABLE, CKG_IDCLK2_GATED);                        // Enable clock
1223 
1224             // Enable EDClk
1225             Hal_SC_set_edclk(pInstance, CKG_EDCLK_F2_345MHZ, ENABLE, MAIN_WINDOW);
1226             Hal_SC_set_edclk(pInstance, CKG_EDCLK_F1_345MHZ, ENABLE, SUB_WINDOW);
1227 
1228             // Enable FMClk
1229             Hal_SC_set_fmclk(psXCInstPri, ENABLE);
1230 
1231             // Enable FIClk2_f2
1232             Hal_SC_set_ficlk2(pInstance, CKG_FICLK2_F2_FCLK, ENABLE, MAIN_WINDOW);
1233         }
1234 #if(HW_DESIGN_4K2K_VER == 4 || HW_DESIGN_4K2K_VER == 6)
1235         else
1236         {
1237             // Enable FIClk2
1238             MDrv_WriteByteMask(REG_CKG_S2_FICLK2_F2, CKG_S2_FICLK2_F2_FCLK, CKG_S2_FICLK2_F2_MASK);          // select FClk first, if pre-scaling down -> change to CKG_S2_FICLK_F1_IDCLK2
1239             MDrv_WriteRegBit(REG_CKG_S2_FICLK2_F2, DISABLE, CKG_S2_FICLK2_F2_INVERT);                   // Not Invert
1240             MDrv_WriteRegBit(REG_CKG_S2_FICLK2_F2, DISABLE, CKG_S2_FICLK2_F2_GATED);                    // Enable clock
1241             // Enable FClk
1242             MDrv_WriteByteMask(REG_CKG_S2_FCLK, CKG_S2_FCLK_DEFAULT, CKG_S2_FCLK_MASK);                   // select 170MHz, if not enough (for example, scaling bandwidth not enough), increase this
1243             MDrv_WriteRegBit(REG_CKG_S2_FCLK, DISABLE, CKG_S2_FCLK_INVERT);                           // Not Invert
1244             MDrv_WriteRegBit(REG_CKG_S2_FCLK, DISABLE, CKG_S2_FCLK_GATED);                            // Enable clock
1245 
1246             // Enable IDClk2
1247             MDrv_WriteByteMask(REG_CKG_S2_IDCLK2, CKG_S2_IDCLK2_XTAL, CKG_S2_IDCLK2_MASK);               // initial to XTAL first, will be changed when switch input source
1248             MDrv_WriteRegBit(REG_CKG_S2_IDCLK2, DISABLE, CKG_S2_IDCLK2_INVERT);                       // Not Invert
1249             MDrv_WriteRegBit(REG_CKG_S2_IDCLK2, DISABLE, CKG_S2_IDCLK2_GATED);                        // Enable clock
1250 #if(HW_DESIGN_4K2K_VER == 6)
1251             // copy from halpnl.c init xc clk condition, to set the subwindow Odclk.
1252             if(MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
1253             {
1254                 if( ( E_XC_PNL_LPLL_VBY1_10BIT_16LANE == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type )||
1255                     ( E_XC_PNL_LPLL_VBY1_8BIT_16LANE == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) ||
1256                     ( E_XC_PNL_LPLL_VBY1_10BIT_1LANE == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) ||
1257                     ( E_XC_PNL_LPLL_VBY1_8BIT_1LANE == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) ||
1258                     ( E_XC_PNL_LPLL_TTL == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) ||
1259                     (( E_XC_PNL_LPLL_LVDS == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) &&
1260                     ( E_XC_MOD_OUTPUT_SINGLE == pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u8LPLL_Mode )) ||
1261                     (( E_XC_PNL_LPLL_HS_LVDS == (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type ) &&
1262                     ( E_XC_MOD_OUTPUT_SINGLE == pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u8LPLL_Mode)))
1263                 {
1264                     MDrv_WriteByteMask(REG_CKG_S2_ODCLK, 0x04, CKG_S2_ODCLK_MASK);
1265                 }
1266                 else
1267                 {
1268                     MDrv_WriteByteMask(REG_CKG_S2_ODCLK, 0x0C, CKG_S2_ODCLK_MASK);
1269                 }
1270             }
1271 #endif
1272 
1273 #ifdef MONACO_SC2_PATCH
1274             // Enable reg_sc2_odclk_div_en
1275             MDrv_WriteByteMask(0x101E2C , 0x0E, 0x0E);
1276             MDrv_WriteByteMask(0x101E30 , 0x11, 0x11);
1277 #endif
1278         }
1279 #endif
1280 #endif
1281 
1282 #ifdef UFO_XC_HDR
1283 #if (UFO_XC_HDR_VERSION == 2)
1284         // Enable SPT4K_L2
1285         MDrv_WriteByteMask(REG_CKG_S2_GOP_HDR, CKG_S2_GOP_HDR_EDCLK, CKG_S2_GOP_HDR_MASK);
1286         MDrv_WriteRegBit(REG_CKG_S2_GOP_HDR, DISABLE, CKG_S2_GOP_HDR_INVERT); // Not Invert
1287         MDrv_WriteRegBit(REG_CKG_S2_GOP_HDR, DISABLE, CKG_S2_GOP_HDR_GATED);
1288 
1289         MDrv_WriteRegBit(REG_CKG_S2_MECLK, DISABLE, CKG_S2_MECLK_INVERT); // Not Invert
1290         MDrv_WriteRegBit(REG_CKG_S2_MECLK, DISABLE, CKG_S2_MECLK_GATED);
1291 
1292         MDrv_WriteRegBit(REG_CKG_S2_MGCLK, DISABLE, CKG_S2_MGCLK_INVERT); // Not Invert
1293         MDrv_WriteRegBit(REG_CKG_S2_MGCLK, DISABLE, CKG_S2_MGCLK_GATED);
1294 #endif
1295 #endif
1296 
1297 #endif
1298         MDrv_SC_SetDisplay_LineBuffer_Mode(pInstance, ENABLE);
1299         MDrv_SC_SetDisplay_Start_Mode(pInstance, ENABLE);
1300 
1301         //Set line buffer merge address
1302         //This value will not changed. It is depend on line buffer size of main window.
1303         MDrv_SC_Set_LB_MergeAddress(pInstance);
1304 
1305         //For pip, need to enable sub line buffer first
1306         MDrv_XC_FilLineBuffer(pInstance, ENABLE, SUB_WINDOW);
1307 
1308         // Set PAFRC mixed with noise dither disable---Move the control to pnl mod init
1309         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK24_3F_L, 0x0, 0x8);
1310 
1311         //extra fetch between main and sub
1312         //if the setting value is too big, hw cannot catch up
1313         //by CC, it's safe to set 1366x768 panel the same with 1920x1080 panel.
1314         Hal_SC_Set_extra_fetch_line(pInstance, 0x05);//H:extra fetch line
1315         Hal_SC_Set_extra_adv_line(pInstance, 0x03);  //V:extra advance line
1316 
1317         MDrv_SC_SetSkipWaitVsync(pInstance, MAIN_WINDOW, FALSE);
1318         MDrv_SC_SetSkipWaitVsync(pInstance, SUB_WINDOW , FALSE);
1319 
1320         // enable osd layer blending with main window
1321 #if (VIDEO_OSD_SWITCH_VER > 1)
1322         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, BIT(6), BIT(6));
1323 #endif
1324 #ifdef K3_U2
1325         //Mantis issue of 0266525 . Need to toggle IP write mask field count clear before input V sync .
1326         //Main window
1327         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(4), BIT(4) |BIT(5) |BIT(6));
1328         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0, BIT(7));
1329         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(7), BIT(7));
1330         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0, BIT(7));
1331         //Sub window
1332         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, BIT(4), BIT(4) |BIT(5) |BIT(6));
1333         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, 0, BIT(7));
1334         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, BIT(7), BIT(7));
1335         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, 0, BIT(7));
1336 #endif
1337         //if mweEnable not be called, sub win will be open default, we need to black it at first.
1338         //so that to avoid garbage when opening sub win.
1339         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(5), BIT(5));
1340 #if (PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB == 0)
1341         gSrcInfo[SUB_WINDOW].bBlackscreenEnabled = TRUE;
1342 #endif
1343 #if SUPPORT_SEAMLESS_ZAPPING
1344         // for seamless zapping, this bit will maximize IP motion detection inside scaler
1345         // this motion setting will NOT override PQ's setting.
1346         // no need to be controlled by Qmap
1347         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_45_L, BIT(9) , BIT(9));
1348 #endif
1349 
1350         // this should only turned on when Top Bottom input with PreV scaling down enabled.
1351         // but the hardware's default value is ON so we turned off when inited.
1352         HAL_SC_Set_vsd_3D_autofactor_reset(pInstance, DISABLE, MAIN_WINDOW);
1353 
1354         // Enable IPM tune after DS feature
1355         MDrv_XC_EnableIPMTuneAfterDS(pInstance, ENABLE);
1356 
1357         //enable F2 IPM wbank freeze alginment mode //mantis:0747407
1358         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, BIT(12) , BIT(12));
1359         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_06_L, BIT(12) , BIT(12));
1360 
1361         _XC_RETURN(pInstance);
1362     }
1363     else
1364     {
1365         // default frame buffer address init
1366         MDrv_XC_SetFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr,
1367                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size, MAIN_WINDOW);
1368         MDrv_XC_SetFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr,
1369                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size, SUB_WINDOW);
1370         // default frcm frame buffer address init
1371         MDrv_XC_SetFRCMFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Start_Addr,
1372                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Size, MAIN_WINDOW);
1373         MDrv_XC_SetFRCMFrameBufferAddressSilently(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Start_Addr,
1374                                               pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Size, SUB_WINDOW);
1375         //when from mboot to AP, there is an OS switch, so we need to do interrupt handle again.
1376         /**
1377          * !!! Attention !!! The ISR interface is different from Chakra2 and Utopia.
1378          * In Chakra2, there are two para needed, MHAL_SavedRegisters and vector.
1379          * In Utopia, there is no parameter.
1380          */
1381 #ifdef MSOS_TYPE_LINUX_KERNEL
1382         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1383         {
1384             MsOS_AttachInterrupt_Shared(E_INT_IRQ_DISP,(InterruptCb) MDrv_SC_isr);
1385         }
1386         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1387         {
1388             MsOS_AttachInterrupt_Shared(E_INT_IRQ_DISP1,(InterruptCb) MDrv_SC1_isr);
1389         }
1390 #else
1391         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1392         {
1393             MsOS_AttachInterrupt(E_INT_IRQ_DISP,(InterruptCb) MDrv_SC_isr);
1394         }
1395         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1396         {
1397             MsOS_AttachInterrupt(E_INT_IRQ_DISP1,(InterruptCb) MDrv_SC1_isr);
1398         }
1399 #endif
1400         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
1401         {
1402             MsOS_EnableInterrupt(E_INT_IRQ_DISP);
1403         }
1404         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
1405         {
1406             MsOS_EnableInterrupt(E_INT_IRQ_DISP1);
1407         }
1408     }
1409 
1410 #if FRC_INSIDE
1411     // In A5 new feature,pre-arbiter can support (IPM_W and IPS_R)/(IPM_R and IPS_W)/(OP_R and OPW)  use the same MIU request client
1412     //Others, total 6 MIU request client
1413 
1414     // Current setting is : Turn off the max request function of pre-arbiter(2 to 1)
1415     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_63_L,0x0A00); // 0xFF00 // miu merge arbiter IP0
1416     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_68_L,0x0A00); // 0xFF00 // miu merge arbiter IP1
1417     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_6A_L,0x1000); // 0xFF00 // miu merge arbiter OP
1418     MHal_FRC_3DLR_Select(pInstance, FALSE);
1419 #endif
1420 
1421     //for HDMI AV mute, when AVMUTE = 1, HDMI will notice to XC to disable the input source on Main/Sub
1422     Hal_SC_Enable_AVMute(pInstance, MAIN_WINDOW);
1423     Hal_SC_Enable_AVMute(pInstance, SUB_WINDOW);
1424 
1425 #if (HW_DESIGN_4K2K_VER == 4)
1426     // for HW Auto No signal can control FRCM freeze
1427     Hal_SC_set_frcm_to_freeze(pInstance, ENABLE, MAIN_WINDOW);
1428     Hal_SC_set_frcm_to_freeze(pInstance, ENABLE, SUB_WINDOW);
1429 
1430     // for 3D 6Tap
1431     Hal_SC_3D_set_top_win_6Tap(pInstance, ENABLE);
1432 #endif
1433 
1434     Hal_SC_Init(pInstance);
1435 
1436     Hal_SC_set_T3D_H_size(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
1437 #ifdef CONFIG_MSTAR_SRAMPD
1438     // To avoid mantis 1082875: boot logo flash issue, remove  SRAM PD for LD from XC_init to PNL_init
1439     //MHal_XC_Set_LD_SRAM_Power_Down(pInstance, TRUE);
1440     Hal_SC_EnableCLK_for_SUB(pInstance, FALSE);
1441     Hal_SC_Sub_SRAM_PowerDown_Control(pInstance,FALSE);
1442     MHal_XC_Set_ADC_SRAM_Power_Down(pInstance, TRUE);
1443 #endif
1444     if(!(MHal_XC_Init_Patch(pInstance, ENABLE, MAIN_WINDOW)))
1445     {
1446         printf("no need to patch\n");
1447     }
1448 //    MApi_XC_SetCompressionMode(ENABLE, MAIN_WINDOW);
1449     return TRUE;
1450 }
1451 #ifdef SUPPORT_BWD
MDrv_SC_BWR_mem_cfg_map_bpp(XC_RESOURCE_PRIVATE * pXCResourcePrivate,SCALER_WIN eWindow)1452 static void MDrv_SC_BWR_mem_cfg_map_bpp(XC_RESOURCE_PRIVATE* pXCResourcePrivate, SCALER_WIN eWindow)
1453 {
1454     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_1].u16BWR_MEM_CFG_VALUE = 0x0;
1455     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_1].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_16;
1456 
1457     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_2].u16BWR_MEM_CFG_VALUE = 0x4;
1458     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_2].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_20;
1459 
1460     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_3].u16BWR_MEM_CFG_VALUE = 0x5;
1461     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_3].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_20;
1462 
1463     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_4].u16BWR_MEM_CFG_VALUE = 0x6;
1464     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_4].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_20;
1465 
1466     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_5].u16BWR_MEM_CFG_VALUE = 0x8;
1467     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_5].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_24;
1468 
1469     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_6].u16BWR_MEM_CFG_VALUE = 0x9;
1470     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_6].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_24;
1471 
1472     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_7].u16BWR_MEM_CFG_VALUE = 0xA;
1473     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_7].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_24;
1474 
1475     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_8].u16BWR_MEM_CFG_VALUE = 0xB;
1476     gSrcInfo[eWindow].Status2.stMemCfgMap[E_XC_BWR_MEM_CONFIG_8].eBitPerPixelType = E_XC_BWR_MEM_CFG_BPP_24;
1477 }
1478 #endif
1479 //-------------------------------------------------------------------------------------------------
1480 /// Initialize the XC
1481 /// If the length is 0, it won't do anything except the mutex and share memory. Usually it is the action of DFB
1482 /// @param  pXC_InitData                  \b IN: the Initialized Data
1483 /// @param  u32InitDataLen                \b IN: the length of the initialized data
1484 /// @return @ref MS_BOOL
1485 //-------------------------------------------------------------------------------------------------
MApi_XC_Init_U2(void * pInstance,XC_INITDATA * pXC_InitData,MS_U32 u32InitDataLen)1486 MS_BOOL MApi_XC_Init_U2(void* pInstance, XC_INITDATA *pXC_InitData, MS_U32 u32InitDataLen)
1487 {
1488     char wordISR[] = {"_XC_ISR_Mutex"};
1489 
1490 
1491 #if(XC_CONTEXT_ENABLE)
1492     MS_BOOL bFirstInstance = TRUE;
1493 #endif
1494     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1495     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1496     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1497     MS_U8 u8VerCharIndex = 0 ;
1498     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
1499 
1500     printf("[XC,Version]\33[0;36m ");
1501     for (; u8VerCharIndex < 8 ; u8VerCharIndex++)
1502         printf("%c",_api_xc_version.DDI.change[u8VerCharIndex]);
1503     printf("\n \33[m");
1504     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
1505     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1506 #ifdef MSOS_TYPE_LINUX_KERNEL
1507     init_waitqueue_head(&pXCResourcePrivate->stXC_Utility._XC_EventQueue);
1508 #endif
1509 
1510 #if(XC_CONTEXT_ENABLE)
1511     _MApi_XC_Init_Context(pInstance, &bFirstInstance);
1512     if (!bFirstInstance)
1513     {
1514         //The XC instance already exists
1515         //return TRUE;
1516     }
1517 
1518     if (&(pXCResourcePrivate->stdrvXC_MVideo._SContext) == NULL || &(pXCResourcePrivate->stdrvXC_MVideo._SCShared) == NULL)
1519     {
1520         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[MAPI XC][%06d] create context fail\n", __LINE__);
1521         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1522         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1523         return FALSE;
1524     }
1525 
1526 #endif
1527 
1528     if (_XC_Mutex == -1)
1529     {
1530         _XC_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, "_XC_Mutex", MSOS_PROCESS_SHARED);
1531         if (_XC_Mutex == -1)
1532         {
1533             printf("[MAPI XC]_XC_Mutex create mutex fail\n");
1534             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[MAPI XC][%06d] create mutex fail\n", __LINE__);
1535             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1536             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1537             return FALSE;
1538         }
1539     }
1540 
1541     if (_XC_ISR_Mutex == -1)
1542     {
1543         _XC_ISR_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, wordISR, MSOS_PROCESS_SHARED);
1544         if (_XC_ISR_Mutex == -1)
1545         {
1546             printf("[MAPI XC]_XC_ISR_Mutex create mutex fail\n");
1547             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[MAPI XC][%06d] create ISR mutex fail\n", __LINE__);
1548             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1549             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1550             return FALSE;
1551         }
1552     }
1553 
1554     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1555     // This should be the first function. get MMIO base
1556     if (MDrv_XC_SetIOMapBase_i(pInstance) != TRUE)
1557     {
1558         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Init MDrv_XC_SetIOMapBase() failure\n");
1559     }
1560 
1561     MDrv_XC_SetDeviceOffset(pInstance);
1562 
1563     // If the length is 0, it won't do anything except the mutex and share memory. Usually it is the action of DFB
1564     // if the _bDFBInit is TRUE, it also indicates DFB init case
1565     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
1566     if((0 == u32InitDataLen) || (TRUE == pXCResourcePrivate->stdrvXC_MVideo._bDFBInit))
1567     {
1568         pXCResourcePrivate->stdrvXC_MVideo._bDFBInit = FALSE;
1569 
1570         mvideo_sc_variable_init(pInstance, bFirstInstance, NULL);
1571         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1572         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Init(): the u32InitDataLen is zero or DFB init case.\n");
1573         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1574         return TRUE;
1575     }
1576     MDrv_XC_FPLLCusReset(pInstance);
1577 
1578     pXCResourcePrivate->stdrvXC_MVideo_Context._bEnableEuro = FALSE;//Euro HDTV support flag
1579 #ifndef MSOS_TYPE_OPTEE
1580     if(MApi_PNL_Get_TCON_Capability())
1581     {
1582         if (pXC_InitData->stPanelInfo.eLPLL_Type >= E_XC_PNL_LPLL_EXT)
1583         {
1584             pXC_InitData->stPanelInfo.eLPLL_Type = (E_XC_PNL_LPLL_TYPE)MApi_Pnl_Get_LPLL_Type();
1585         }
1586         printf("%s, %d, pXC_InitData->stPanelInfo.eLPLL_Type=%d\n", __FUNCTION__, __LINE__, pXC_InitData->stPanelInfo.eLPLL_Type);
1587     }
1588 #endif
1589     #ifdef MSOS_TYPE_LINUX_KERNEL
1590     if(is_compat_task())
1591     {
1592         memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, pXC_InitData, sizeof(XC_INITDATA));
1593     }
1594     else
1595     {
1596         memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, pXC_InitData, ((u32InitDataLen>=sizeof(XC_INITDATA))? sizeof(XC_INITDATA):u32InitDataLen));
1597     }
1598     #else
1599     memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, pXC_InitData, ((u32InitDataLen>=sizeof(XC_INITDATA))? sizeof(XC_INITDATA):u32InitDataLen));
1600     #endif
1601     pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32InitDataLen_Suspend = u32InitDataLen;
1602 #if defined (__aarch64__)
1603     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Main_FB(start, size)=(%lx, %lu)\n", pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr,
1604                                                                              pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size);
1605     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Sub_FB (start, size)=(%lx, %lu)\n", pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr,
1606                                                                              pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size);
1607 #else
1608     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Main_FB(start, size)=(%tx, %tu)\n", (ptrdiff_t)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr,
1609                                                                              (ptrdiff_t)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size);
1610     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Sub_FB (start, size)=(%tx, %tu)\n", (ptrdiff_t)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr,
1611                                                                              (ptrdiff_t)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size);
1612 #endif
1613 
1614     // Scart ID port selection is available after version 1.
1615     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32XC_version < 1)
1616     {
1617         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.eScartIDPort_Sel = E_XC_SCARTID_NONE;
1618     }
1619 
1620     mvideo_sc_variable_init(pInstance, bFirstInstance, pXC_InitData);
1621 
1622     // For MI multi init case,we should confirm enPrevPowerState = E_POWER_MECHANICAL
1623     // after STR
1624     pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState = E_POWER_MECHANICAL;
1625     _MApi_XC_Init_WithoutCreateMutex(pInstance, pXC_InitData, u32InitDataLen);
1626     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1627     //MApi_XC_SetDbgLevel(XC_DBGLEVEL_SETTIMING|XC_DBGLEVEL_SETWINDOW);
1628     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1629     //map memory config to bit per pix
1630 #ifdef SUPPORT_BWD
1631     MDrv_SC_BWR_mem_cfg_map_bpp(pXCResourcePrivate, MAIN_WINDOW);
1632 #endif
1633     pXCResourcePrivate->stdrvXC_MVideo.bModuleInited = TRUE;
1634 
1635     return TRUE;
1636 }
1637 
MApi_XC_Init(XC_INITDATA * pXC_InitData,MS_U32 u32InitDataLen)1638 MS_BOOL MApi_XC_Init(XC_INITDATA *pXC_InitData, MS_U32 u32InitDataLen)
1639 {
1640     if (pu32XCInst == NULL)
1641     {
1642         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
1643         {
1644             printf("UtopiaOpen XC failed\n");
1645             return FALSE;
1646         }
1647     }
1648 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1649      if (pu32XCInst_1 == NULL)
1650      {
1651         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
1652         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
1653 
1654         stXCInstantAttribute.u32DeviceID = 1;
1655         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
1656         {
1657             printf("UtopiaOpen XC failed\n");
1658             return E_APIXC_RET_FAIL;
1659         }
1660       }
1661 #endif
1662     stXC_INIT XCArgs;
1663     XCArgs.pXC_InitData = pXC_InitData;
1664     XCArgs.u32InitDataLen = u32InitDataLen;
1665     XCArgs.bReturnValue = FALSE;
1666     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
1667     {
1668         printf("Obtain XC engine fail\n");
1669         return FALSE;
1670     }
1671     else
1672     {
1673         return XCArgs.bReturnValue;
1674     }
1675 }
1676 #if defined(MSOS_TYPE_LINUX_KERNEL)
1677 EXPORT_SYMBOL(MApi_XC_Init);
1678 #endif
1679 
1680 //-------------------------------------------------------------------------------------------------
1681 /// Get the XC init config
1682 /// @param  pXC_InitData                  \b IN: the Initialized Data
1683 /// @return @ref E_APIXC_ReturnValue
1684 //-------------------------------------------------------------------------------------------------
MApi_XC_GetConfig_U2(void * pInstance,XC_INITDATA * pXC_InitData)1685 E_APIXC_ReturnValue MApi_XC_GetConfig_U2(void* pInstance, XC_INITDATA *pXC_InitData)
1686 {
1687     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1688     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1689     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1690     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
1691     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1692     if(pXCResourcePrivate->stdrvXC_MVideo.bModuleInited)
1693     {
1694         memcpy(pXC_InitData, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, sizeof(XC_INITDATA));
1695         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1696         return E_APIXC_RET_OK;
1697     }
1698     else
1699     {
1700         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1701         return E_APIXC_RET_FAIL;
1702     }
1703 }
1704 
MApi_XC_GetConfig(XC_INITDATA * pXC_InitData)1705 E_APIXC_ReturnValue MApi_XC_GetConfig(XC_INITDATA *pXC_InitData)
1706 {
1707     if (pu32XCInst == NULL)
1708     {
1709         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
1710         {
1711             printf("UtopiaOpen XC failed\n");
1712             return E_APIXC_RET_FAIL;
1713         }
1714     }
1715 
1716     stXC_GET_CONFIG XCArgs;
1717     XCArgs.pXC_InitData = pXC_InitData;
1718     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
1719     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_CONFIG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
1720     {
1721         printf("XC engine GET_CONFIG Ioctl fail\n");
1722         return E_APIXC_RET_FAIL;
1723     }
1724     else
1725     {
1726         return XCArgs.eReturnValue;
1727     }
1728 }
1729 
MDrv_XC_Init_MISC(void * pInstance,XC_INITMISC * pXC_Init_Misc,MS_U32 u32InitMiscDataLen)1730 E_APIXC_ReturnValue MDrv_XC_Init_MISC(void *pInstance, XC_INITMISC *pXC_Init_Misc, MS_U32 u32InitMiscDataLen)
1731 {
1732 
1733     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1734     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1735 
1736     MST_PANEL_INFO_t stFRCPanelInfo;
1737     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
1738     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1739     if(u32InitMiscDataLen != sizeof(XC_INITMISC))
1740     {
1741         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1742         return E_APIXC_RET_FAIL;
1743     }
1744 
1745 #if (SUPPORT_IMMESWITCH == 0)
1746     if (pXC_Init_Misc->u32MISC_A & E_XC_INIT_MISC_A_IMMESWITCH )
1747     {
1748         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1749         return E_APIXC_RET_FAIL;
1750     }
1751 #endif
1752 
1753 #if (SUPPORT_DVI_AUTO_EQ == 0)
1754     if (pXC_Init_Misc->u32MISC_A & E_XC_INIT_MISC_A_DVI_AUTO_EQ)
1755     {
1756         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1757         return E_APIXC_RET_FAIL;
1758     }
1759 #endif
1760 
1761 #if (FRC_INSIDE == 0)
1762     if ((pXC_Init_Misc->u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE) || (pXC_Init_Misc->u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_60HZ))
1763     {
1764         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1765 
1766         return E_APIXC_RET_FAIL;
1767     }
1768 #endif
1769 
1770     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1771     // Start only when all setting ready.
1772     memset(&stFRCPanelInfo, 0, sizeof(MST_PANEL_INFO_t));
1773 
1774     memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc, pXC_Init_Misc, u32InitMiscDataLen);
1775     pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32InitMiscDataLen_Suspend = u32InitMiscDataLen;
1776 
1777     if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FAST_GET_VFREQ)
1778     {
1779         pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFast_Get_VFreq = TRUE;
1780     }
1781     else
1782     {
1783         pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFast_Get_VFreq = FALSE;
1784     }
1785 
1786     #if (FRC_INSIDE)
1787     if(((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE)
1788         || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_60HZ)
1789         || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K1K_120HZ)
1790         || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ)
1791         || (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_KEEP_OP_4K2K))
1792         #if (HW_DESIGN_4K2K_VER == 6)
1793         && (TRUE == MHal_FRC_IsSupportFRC_byEfuse(pInstance))
1794         #endif
1795         )
1796     {
1797         if (FALSE == pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited)
1798         {
1799             MHal_CLKGEN_FRC_Init(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u8LPLL_Mode);
1800             MDrv_FRC_PNLInfo_Transform(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo,
1801                                    &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc,
1802                                    &stFRCPanelInfo);
1803             // when OUTPUT is 4k2k@60Hz then we turn on FRC
1804             // in other case , we stil do FRC init but we choose to bypass FRC
1805             if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq < 600)
1806                 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width == 3840)
1807                 && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == 2160))
1808             {
1809                 MDrv_FRC_ByPass_Enable(pInstance, TRUE);
1810             }
1811             else
1812             {
1813                 MDrv_FRC_ByPass_Enable(pInstance, FALSE);
1814             }
1815 
1816             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC) // init ready?! if yes, continue
1817             {
1818                 MDrv_FRC_Init(pInstance, &stFRCPanelInfo, &(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo));
1819                 gSrcInfo[MAIN_WINDOW].Status2.bInFRCMode = TRUE; //Store FRC enable state in share memory for multi-process
1820                 gSrcInfo[SUB_WINDOW].Status2.bInFRCMode = gSrcInfo[MAIN_WINDOW].Status2.bInFRCMode;
1821                 MHal_FRC_3DLR_Select(pInstance, TRUE);
1822             }
1823             pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited = TRUE;
1824         }
1825 
1826         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_KEEP_OP_4K2K)
1827         {
1828             // SW patch here, if AP set keep OP as 4K2K, need to adjust DE and Htt before FRC setting is 4K2K
1829             if (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0C_L) < 3000
1830 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB//follow HW_DESIGN_4K2K_VER = 6 rule
1831                && (psXCInstPri->u32DeviceID == 0)
1832 #endif
1833             )
1834             {
1835                 if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
1836                 {
1837                     _MLOAD_ENTRY(pInstance);
1838 
1839                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0C_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal, VOP_HTT_MASK);
1840                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1), VOP_DE_HEND_MASK);
1841 
1842                     MDrv_XC_MLoad_Fire(pInstance, TRUE);
1843                     _MLOAD_RETURN(pInstance);
1844                 }
1845                 else
1846                 {
1847                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0C_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal);
1848                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - 1));
1849                 }
1850             }
1851         }
1852 
1853         //printf("\n## FRC %s mode\n",g_XC_Pnl_Misc.FRCInfo.bFRC?"NORMAL":"BYPASS");
1854         //printf("## FRC LPLL mode =%d\n\n",g_XC_InitData.stPanelInfo.u8LPLL_Mode);
1855         //printf("[%s][%d]\n",__FUNCTION__,__LINE__);
1856     }
1857     else
1858     {
1859         MDrv_FRC_ByPass_Enable(pInstance, TRUE);
1860     }
1861     #endif
1862 #if (HW_DESIGN_4K2K_VER == 4)
1863     if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1864          ||(psXCInstPri->u32DeviceID == 1))
1865     {
1866         MDrv_SC_Enable_LegacyMode(pInstance, TRUE);
1867     }
1868     else
1869     {
1870         MDrv_SC_Enable_LegacyMode(pInstance, FALSE);
1871     }
1872 #endif
1873     //printf("[%s][%d]\n",__FUNCTION__,__LINE__);
1874     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1875 
1876     return E_APIXC_RET_OK;
1877 }
1878 
MApi_XC_Init_MISC_U2(void * pInstance,XC_INITMISC * pXC_Init_Misc,MS_U32 u32InitMiscDataLen)1879 E_APIXC_ReturnValue MApi_XC_Init_MISC_U2(void* pInstance, XC_INITMISC *pXC_Init_Misc, MS_U32 u32InitMiscDataLen)
1880 {
1881     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
1882     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1883     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1884     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
1885     eReturn = MDrv_XC_Init_MISC(pInstance, pXC_Init_Misc, u32InitMiscDataLen);
1886     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1887     return eReturn;
1888 }
1889 
1890 
MApi_XC_Init_MISC(XC_INITMISC * pXC_Init_Misc,MS_U32 u32InitMiscDataLen)1891 E_APIXC_ReturnValue MApi_XC_Init_MISC(XC_INITMISC *pXC_Init_Misc, MS_U32 u32InitMiscDataLen)
1892 {
1893     if (pu32XCInst == NULL
1894 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1895         || pu32XCInst_1 == NULL
1896 #endif
1897         )
1898     {
1899         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
1900         return E_APIXC_RET_FAIL;
1901     }
1902 
1903     stXC_INIT_MISC XCArgs;
1904     XCArgs.pXC_Init_Misc = pXC_Init_Misc;
1905     XCArgs.u32InitMiscDataLen = u32InitMiscDataLen;
1906     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
1907 
1908     if((UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
1909 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1910         || (UtopiaIoctl(pu32XCInst_1, E_XC_CMD_INIT_MISC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
1911 #endif
1912         )
1913     {
1914         printf("Obtain XC engine fail\n");
1915         return E_APIXC_RET_FAIL;
1916     }
1917     else
1918     {
1919         return XCArgs.eReturnValue;
1920     }
1921 }
1922 
MDrv_XC_GetMISCStatus(void * pInstance,XC_INITMISC * pXC_Init_Misc)1923 E_APIXC_ReturnValue MDrv_XC_GetMISCStatus(void* pInstance, XC_INITMISC *pXC_Init_Misc)
1924 {
1925     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
1926     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1927     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1928     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1929 
1930     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1931     memcpy(pXC_Init_Misc,&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc,sizeof(XC_INITMISC));
1932 
1933     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
1934 
1935     return E_APIXC_RET_OK;
1936 }
MApi_XC_GetMISCStatus_U2(void * pInstance,XC_INITMISC * pXC_Init_Misc)1937 E_APIXC_ReturnValue MApi_XC_GetMISCStatus_U2(void* pInstance, XC_INITMISC *pXC_Init_Misc)
1938 {
1939     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
1940     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
1941 
1942     eReturn = MDrv_XC_GetMISCStatus(pInstance, pXC_Init_Misc);
1943     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
1944 
1945     return eReturn;
1946 }
MApi_XC_GetMISCStatus(XC_INITMISC * pXC_Init_Misc)1947 E_APIXC_ReturnValue MApi_XC_GetMISCStatus(XC_INITMISC *pXC_Init_Misc)
1948 {
1949     if (pu32XCInst == NULL)
1950     {
1951         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
1952         {
1953             printf("UtopiaOpen XC failed\n");
1954             return E_APIXC_RET_FAIL;
1955         }
1956     }
1957     static XC_INITMISC tmp_Init_Misc;
1958     stXC_GET_MISC_STATUS XCArgs;
1959     memcpy(&tmp_Init_Misc,pXC_Init_Misc,sizeof(XC_INITMISC));
1960     XCArgs.pXC_Init_Misc = &tmp_Init_Misc;
1961     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
1962 
1963     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MISC_STATUS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
1964     {
1965         printf("Obtain XC engine fail\n");
1966         return E_APIXC_RET_FAIL;
1967     }
1968     else
1969     {
1970         memcpy(pXC_Init_Misc,&tmp_Init_Misc,sizeof(XC_INITMISC));
1971         return XCArgs.eReturnValue;
1972     }
1973 }
1974 
MApi_XC_GetChipCaps_U2(void * pInstance,E_XC_CAPS eCapType,MS_U32 * pRet,MS_U32 ret_size)1975 E_APIXC_ReturnValue MApi_XC_GetChipCaps_U2(void* pInstance, E_XC_CAPS eCapType, MS_U32* pRet, MS_U32 ret_size)
1976 {
1977     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
1978 
1979     eReturn = MDrv_XC_GetChipCaps(pInstance, eCapType, pRet, ret_size);
1980 
1981     return eReturn;
1982 }
1983 
MApi_XC_GetChipCaps(E_XC_CAPS eCapType,MS_U32 * pRet,MS_U32 ret_size)1984 E_APIXC_ReturnValue MApi_XC_GetChipCaps(E_XC_CAPS eCapType, MS_U32* pRet, MS_U32 ret_size)
1985 {
1986 
1987     if (pu32XCInst == NULL)
1988     {
1989         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
1990         return E_APIXC_RET_FAIL;
1991     }
1992 
1993     stXC_GET_CHIP_CAPS XCArgs;
1994     XCArgs.eCapType = eCapType;
1995     XCArgs.pRet = pRet;
1996     XCArgs.ret_size = ret_size;
1997     XCArgs.eReturnValue = 0;
1998 
1999     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_CHIPCAPS, (void*)&XCArgs) != 0)
2000     {
2001         printf("Obtain XC engine fail\n");
2002         return E_APIXC_RET_FAIL;
2003     }
2004     else
2005     {
2006         return XCArgs.eReturnValue;
2007     }
2008 }
2009 
MApi_XC_GetCapability_U2(void * pInstance,MS_U32 u32Id)2010 MS_U32 MApi_XC_GetCapability_U2(void* pInstance, MS_U32 u32Id)
2011 {
2012     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2013     MS_U32 u32Val = 0;
2014 
2015     switch (u32Id)
2016     {
2017         case E_XC_SUPPORT_IMMESWITCH:
2018             MDrv_XC_GetChipCaps(pInstance, E_XC_IMMESWITCH,&u32Val,sizeof(u32Val));
2019             break;
2020 
2021         case E_XC_SUPPORT_DVI_AUTO_EQ:
2022             MDrv_XC_GetChipCaps(pInstance, E_XC_DVI_AUTO_EQ,&u32Val,sizeof(u32Val));
2023             break;
2024 
2025         case  E_XC_SUPPORT_FRC_INSIDE:
2026             MDrv_XC_GetChipCaps(pInstance ,E_XC_FRC_INSIDE,&u32Val,sizeof(u32Val));
2027             break;
2028         default:
2029             u32Val = 0;
2030             break;
2031     }
2032     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2033     return u32Val;
2034 }
2035 
MApi_XC_GetCapability(MS_U32 u32Id)2036 MS_U32 MApi_XC_GetCapability(MS_U32 u32Id)
2037 {
2038     if (pu32XCInst == NULL)
2039     {
2040         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
2041         {
2042             printf("UtopiaOpen XC failed\n");
2043             return E_APIXC_RET_FAIL;
2044         }
2045     }
2046 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
2047      if (pu32XCInst_1 == NULL)
2048      {
2049         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
2050         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
2051 
2052         stXCInstantAttribute.u32DeviceID = 1;
2053         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
2054         {
2055             printf("UtopiaOpen XC failed\n");
2056             return E_APIXC_RET_FAIL;
2057         }
2058       }
2059 #endif
2060     stXC_GET_CAPABILITY XCArgs;
2061     XCArgs.u32Id = u32Id;
2062     XCArgs.u32ReturnValue = 0;
2063 
2064     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_CAPABILITY, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2065     {
2066         printf("Obtain XC engine fail\n");
2067         return 0;
2068     }
2069     else
2070     {
2071         return XCArgs.u32ReturnValue;
2072     }
2073 }
2074 
2075 
2076 //-------------------------------------------------------------------------------------------------
2077 /// Enable sub window clock.
2078 //-------------------------------------------------------------------------------------------------
MApi_XC_EnableCLK_for_SUB(void * pInstance,MS_BOOL bEnable)2079 void MApi_XC_EnableCLK_for_SUB(void *pInstance, MS_BOOL bEnable)
2080 {
2081     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2082 
2083     MDrv_XC_EnableCLK_for_SUB(pInstance, bEnable);
2084     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2085 }
2086 
2087 //-------------------------------------------------------------------------------------------------
2088 /// Enable DIP window clock.
2089 //-------------------------------------------------------------------------------------------------
MApi_XC_EnableCLK_for_DIP(void * pInstance,MS_BOOL bEnable)2090 void MApi_XC_EnableCLK_for_DIP(void *pInstance, MS_BOOL bEnable)
2091 {
2092     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2093 
2094     MDrv_SC_EnableCLK_for_DIP(pInstance, bEnable);
2095     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2096 }
2097 
2098 //-------------------------------------------------------------------------------------------------
2099 /// This function will change panel type dynamically
2100 /// @param  pstPanelInfo      \b IN: the new panel type
2101 //-------------------------------------------------------------------------------------------------
MApi_XC_ChangePanelType_U2(void * pInstance,XC_PANEL_INFO * pstPanelInfo)2102 void MApi_XC_ChangePanelType_U2(void* pInstance, XC_PANEL_INFO *pstPanelInfo)
2103 {
2104     XC_PANEL_INFO_EX stPanelInfoEx;
2105     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2106     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2107     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2108 
2109     //Reset information used by ex panel info
2110     memset(&stPanelInfoEx, 0, sizeof(XC_PANEL_INFO_EX));
2111     stPanelInfoEx.u16VFreq = PANEL_INFO_EX_INVALID_ALL;
2112     stPanelInfoEx.u32PanelInfoEx_Version = PANEL_INFO_EX_VERSION;
2113     stPanelInfoEx.u16PanelInfoEX_Length = sizeof(XC_PANEL_INFO_EX);
2114     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2115     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2116     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2117 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
2118     if (psXCInstPri->u32DeviceID == 1)
2119     {
2120         /// not support
2121         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2122         return;
2123     }
2124     CHECK_DEVICE1_INSTANCE();
2125     XC_INSTANCE_PRIVATE *psXCInstPri_1 = NULL;
2126     UtopiaInstanceGetPrivate(g_pDevice1Instance, (void**)&psXCInstPri_1);
2127     XC_RESOURCE_PRIVATE* pXCResourcePrivate_1 = NULL;
2128     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri_1->u32DeviceID)],(void**)(&pXCResourcePrivate_1));
2129 #endif
2130     MDrv_XC_SetExPanelInfo(pInstance, FALSE, &stPanelInfoEx);
2131     _XC_ENTRY(pInstance);
2132     MDrv_XC_GetDefaultHVSyncInfo(pInstance);
2133     _XC_RETURN(pInstance);
2134 
2135 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
2136     MDrv_XC_SetExPanelInfo(g_pDevice1Instance, FALSE, &stPanelInfoEx);
2137     _XC_ENTRY(g_pDevice1Instance);
2138     MDrv_XC_GetDefaultHVSyncInfo(g_pDevice1Instance);
2139     _XC_RETURN(g_pDevice1Instance);
2140 #endif
2141 
2142     if (pstPanelInfo->eLPLL_Type == E_XC_PNL_LPLL_EXT)
2143     {
2144         pstPanelInfo->eLPLL_Type = (E_XC_PNL_LPLL_TYPE)MApi_Pnl_Get_LPLL_Type();
2145     }
2146     //printf("%s, %d, pstPanelInfo->eLPLL_Type=%d\n", __FUNCTION__, __LINE__, pstPanelInfo->eLPLL_Type);
2147 
2148     memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo, pstPanelInfo, sizeof(XC_PANEL_INFO));
2149     memcpy(&(gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming), &(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo), sizeof(XC_PANEL_TIMING));
2150 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
2151     memcpy(&pXCResourcePrivate_1->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo, pstPanelInfo, sizeof(XC_PANEL_INFO));
2152     memcpy(&(gSrcInfo_1[MAIN_WINDOW].Status2.stXCPanelDefaultTiming), &(pXCResourcePrivate_1->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo), sizeof(XC_PANEL_TIMING));
2153 #endif
2154     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2155     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2156 }
2157 
MApi_XC_ChangePanelType(XC_PANEL_INFO * pstPanelInfo)2158 void MApi_XC_ChangePanelType(XC_PANEL_INFO *pstPanelInfo)
2159 {
2160     if (pu32XCInst == NULL)
2161     {
2162         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2163         return;
2164     }
2165 
2166     stXC_SET_CHANGE_PANELTYPE XCArgs;
2167     XCArgs.pstPanelInfo = pstPanelInfo;
2168 
2169     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_CHANGE_PANELTYPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2170     {
2171         printf("Obtain XC engine fail\n");
2172         return;
2173     }
2174     else
2175     {
2176         return;
2177     }
2178 }
2179 
2180 //-------------------------------------------------------------------------------------------------
2181 /// This function will let scaler driver know if to decide best pre-scaling down ratio based on FB size of not.
2182 /// Please set this before call MApi_XC_SetWindow()
2183 /// @param  bEnable      \b IN: enable this feature or not
2184 //-------------------------------------------------------------------------------------------------
MApi_XC_SetAutoPreScaling_U2(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)2185 void MApi_XC_SetAutoPreScaling_U2(void* pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
2186 {
2187     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2188     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2189     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2190     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2191     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2192     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2193     gSrcInfo[eWindow].Status2.bAutoBestPreScaling = bEnable;
2194     //printf("MApi_XC_SetAutoPreScaling(): obsolete interface\n");
2195     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2196     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2197 }
2198 
MApi_XC_SetAutoPreScaling(MS_BOOL bEnable,SCALER_WIN eWindow)2199 void MApi_XC_SetAutoPreScaling(MS_BOOL bEnable, SCALER_WIN eWindow)
2200 {
2201     if (pu32XCInst == NULL)
2202     {
2203         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2204         return;
2205     }
2206 
2207     stXC_SET_AUTO_PRESCALING XCArgs;
2208     XCArgs.bEnable = bEnable;
2209     XCArgs.eWindow = eWindow;
2210 
2211     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_AUTO_PRESCALING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2212     {
2213         printf("Obtain XC engine fail\n");
2214         return;
2215     }
2216     else
2217     {
2218         return;
2219     }
2220 }
2221 
2222 //-------------------------------------------------------------------------------------------------
2223 /// This function will enable/diable output black pattern
2224 /// @param  bEnable      \b IN: TRUE: enable, FALSE: otherwise
2225 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_BLSK_U2(void * pInstance,MS_BOOL bEnable)2226 void MApi_XC_Set_BLSK_U2(void* pInstance, MS_BOOL bEnable)
2227 {
2228     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2229     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2230     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2231     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2232     _XC_ENTRY(pInstance);
2233     MDrv_SC_Set_BLSK(pInstance, bEnable);
2234     _XC_RETURN(pInstance);
2235     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2236     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2237 }
2238 
MApi_XC_Set_BLSK(MS_BOOL bEnable)2239 void MApi_XC_Set_BLSK(MS_BOOL bEnable)
2240 {
2241     if (pu32XCInst == NULL)
2242     {
2243         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2244         return;
2245     }
2246 
2247     stXC_SET_BLACKSCREEN XCArgs;
2248     XCArgs.bEnable = bEnable;
2249 
2250     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BLACKSCREEN, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2251     {
2252         printf("Obtain XC engine fail\n");
2253         return;
2254     }
2255     else
2256     {
2257         return;
2258     }
2259 }
2260 
2261 
MApi_XC_GenerateBlackVideoForBothWin_U2(void * pInstance,MS_BOOL bEnable)2262 void MApi_XC_GenerateBlackVideoForBothWin_U2( void* pInstance, MS_BOOL bEnable)
2263 {
2264     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2265     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2266     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2267     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2268     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2269     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2270     _XC_ENTRY(pInstance);
2271     if(E_MLOAD_ENABLED == MDrv_XC_MLoad_GetStatus(pInstance))
2272     {
2273         MDrv_SC_GenerateBlackVideoForBothWin(pInstance, bEnable);
2274     }
2275     else
2276     {
2277         MDrv_XC_WaitOutputVSync(pInstance, 1, 50, MAIN_WINDOW);
2278         MDrv_SC_GenerateBlackVideo(pInstance, bEnable, MAIN_WINDOW);
2279         MDrv_XC_WaitOutputVSync(pInstance, 1, 50, SUB_WINDOW);
2280         MDrv_SC_GenerateBlackVideo( pInstance, bEnable, SUB_WINDOW);
2281     }
2282     gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled = bEnable;
2283     gSrcInfo[SUB_WINDOW].bBlackscreenEnabled = bEnable;
2284     _XC_RETURN(pInstance);
2285     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2286     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2287 }
2288 
MApi_XC_GenerateBlackVideoForBothWin(MS_BOOL bEnable)2289 void MApi_XC_GenerateBlackVideoForBothWin( MS_BOOL bEnable)
2290 {
2291     if (pu32XCInst == NULL)
2292     {
2293         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2294         return;
2295     }
2296 
2297     stXC_SET_BOTHWINDOW_BLACKVIDEO XCArgs;
2298     XCArgs.bEnable = bEnable;
2299 
2300     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BOTHWINDOW_BLACKVIDEO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2301     {
2302         printf("Obtain XC engine fail\n");
2303         return;
2304     }
2305     else
2306     {
2307         return;
2308     }
2309 }
2310 
2311 #ifdef UFO_XC_SETBLACKVIDEOBYMODE
2312 //-------------------------------------------------------------------------------------------------
2313 /// This function will enable/diable output black pattern by mode
2314 /// @param  bEnable      \b IN: TRUE: enable, FALSE: otherwise
2315 /// @param  eWindow    \b IN: which window we are going to query
2316 /// @param  eMode        \b IN: which black video mode we are going to use
2317 //-------------------------------------------------------------------------------------------------
MApi_XC_GenerateBlackVideoByMode_U2(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow,EN_XC_BLACK_VIDEO_MODE eMode)2318 E_APIXC_ReturnValue MApi_XC_GenerateBlackVideoByMode_U2( void* pInstance, MS_BOOL bEnable, SCALER_WIN eWindow, EN_XC_BLACK_VIDEO_MODE eMode )
2319 {
2320     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2321     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2322     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2323     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2324     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
2325 
2326     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2327     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2328     _XC_ENTRY(pInstance);
2329 
2330     if(eWindow < MAX_WINDOW)
2331     {
2332         eRet = MDrv_SC_GenerateBlackVideoByMode(pInstance, bEnable, eWindow, eMode);
2333         gSrcInfo[eWindow].bBlackscreenEnabled = bEnable;
2334     }
2335     else
2336     {
2337         // For now not supporting memsync black for both window
2338         if(eMode == E_XC_BLACK_VIDEO_MEMSYNC)
2339         {
2340             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "Not supporting both window memsync black video, using basic mode\n");
2341         }
2342 
2343         MDrv_SC_GenerateBlackVideoForBothWin(pInstance, bEnable);
2344         gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled = gSrcInfo[SUB_WINDOW].bBlackscreenEnabled = bEnable;
2345         eRet = E_APIXC_RET_OK;
2346     }
2347 
2348     _XC_RETURN(pInstance);
2349     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2350     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2351     return eRet;
2352 }
2353 
MApi_XC_GenerateBlackVideoByMode(MS_BOOL bEnable,SCALER_WIN eWindow,EN_XC_BLACK_VIDEO_MODE eMode)2354 E_APIXC_ReturnValue MApi_XC_GenerateBlackVideoByMode ( MS_BOOL bEnable, SCALER_WIN eWindow, EN_XC_BLACK_VIDEO_MODE eMode )
2355 {
2356     if (pu32XCInst == NULL)
2357     {
2358         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2359         return E_APIXC_RET_FAIL;
2360     }
2361 
2362     stXC_SET_BLACKVIDEO_BYMODE XCArgs;
2363     XCArgs.bEnable = bEnable;
2364     XCArgs.eWindow = eWindow;
2365     XCArgs.eMode = eMode;
2366     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
2367 
2368     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BLACKVIDEO_BYMODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2369     {
2370         printf("Obtain XC engine fail\n");
2371         return E_APIXC_RET_FAIL;
2372     }
2373     else
2374     {
2375         return XCArgs.eReturnValue;
2376     }
2377 }
2378 #endif
2379 
2380 //-------------------------------------------------------------------------------------------------
2381 /// This function will enable/diable output black pattern
2382 /// @param  bEnable      \b IN: TRUE: enable, FALSE: otherwise
2383 //-------------------------------------------------------------------------------------------------
MApi_XC_GenerateBlackVideo_U2(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)2384 void MApi_XC_GenerateBlackVideo_U2( void* pInstance, MS_BOOL bEnable, SCALER_WIN eWindow )
2385 {
2386     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2387     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2388     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2389     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2390     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2391     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2392     _XC_ENTRY(pInstance);
2393     //wait VSync and do setting in Vblanking to avoid broken picture
2394 
2395     if(MDrv_XC_MLoad_GetStatus(pInstance) != E_MLOAD_ENABLED)
2396     {
2397         MDrv_XC_WaitOutputVSync(pInstance, 1, 50, MAIN_WINDOW);
2398     }
2399 
2400     if ( eWindow < MAX_WINDOW )
2401     {
2402         MDrv_SC_GenerateBlackVideo(pInstance, bEnable, eWindow );
2403         gSrcInfo[eWindow].bBlackscreenEnabled = bEnable;
2404     }
2405     else
2406     {
2407         MDrv_SC_GenerateBlackVideoForBothWin(pInstance, bEnable);
2408         gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled = gSrcInfo[SUB_WINDOW].bBlackscreenEnabled = bEnable;
2409     }
2410 
2411     #if TEST_NEW_DYNAMIC_NR   //Why turn on/of DNR here, but not in SetBlueScreen?
2412     // DNR should be turned on only if video is avaliable.m
2413     if (mvideo_sc_is_enable_3dnr(pInstance, MAIN_WINDOW))
2414     {
2415         //printk("Enable 3DNR %bu (flag is 0x%x\n", !bEnable, g_SrcInfo.u16ColorFinetuneFlag & FINETUNE_3DNR);
2416         MDrv_Scaler_Enable3DNR(pInstance, !bEnable, MAIN_WINDOW);
2417     }
2418     #endif
2419 
2420 #if 0
2421     // Enable FPD function when source is MVOP ouput & "Not" in FBL mode.
2422     {
2423         if( (IsSrcTypeDTV(gSrcInfo[eWindow].enInputSourceType) || IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType) ) &&
2424             (!MDrv_XC_IsCurrentFrameBufferLessMode()))
2425         {
2426             MApi_XC_set_FD_Mask( !bEnable );
2427         }
2428     }
2429 #endif
2430     _XC_RETURN(pInstance);
2431     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2432 
2433     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2434 
2435 }
2436 
MApi_XC_GenerateBlackVideo(MS_BOOL bEnable,SCALER_WIN eWindow)2437 void MApi_XC_GenerateBlackVideo ( MS_BOOL bEnable, SCALER_WIN eWindow )
2438 {
2439     if (pu32XCInst == NULL)
2440     {
2441         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2442         return;
2443     }
2444 
2445     stXC_SET_BLACKVIDEO XCArgs;
2446     XCArgs.bEnable = bEnable;
2447     XCArgs.eWindow = eWindow;
2448 
2449     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BLACKVIDEO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2450     {
2451         printf("Obtain XC engine fail\n");
2452         return;
2453     }
2454     else
2455     {
2456         return;
2457     }
2458 }
2459 
2460 //-------------------------------------------------------------------------------------------------
2461 /// Query whether current XC is black video enabled or not
2462 /// @return @ref MS_BOOL
2463 //-------------------------------------------------------------------------------------------------
MApi_XC_IsBlackVideoEnable_U2(void * pInstance,SCALER_WIN eWindow)2464 MS_BOOL MApi_XC_IsBlackVideoEnable_U2( void* pInstance, SCALER_WIN eWindow )
2465 {
2466     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2467     MS_BOOL bEnable = FALSE;
2468     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2469     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2470     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2471     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2472     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2473     bEnable = gSrcInfo[eWindow].bBlackscreenEnabled;
2474     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2475     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2476     return bEnable;
2477 }
2478 
MApi_XC_IsBlackVideoEnable(SCALER_WIN eWindow)2479 MS_BOOL MApi_XC_IsBlackVideoEnable( SCALER_WIN eWindow )
2480 {
2481     if (pu32XCInst == NULL)
2482     {
2483         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2484         return FALSE;
2485     }
2486 
2487     stXC_CHECK_BLACKVIDEO_ENABLE XCArgs;
2488     XCArgs.eWindow = eWindow;
2489     XCArgs.bReturnValue = FALSE;
2490 
2491     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_BLACKVIDEO_ENABLE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2492     {
2493         printf("Obtain XC engine fail\n");
2494         return FALSE;
2495     }
2496     else
2497     {
2498         return XCArgs.bReturnValue;
2499     }
2500 }
2501 
2502 //-------------------------------------------------------------------------------------------------
2503 /// wait for input sync
2504 /// @param  u8NumVSyncs        \b IN: the number of VSync we are going to wait
2505 /// @param  u16Timeout         \b IN: time out
2506 /// @return @ref MS_U8 retun the number of left Vsync if timeout
2507 //-------------------------------------------------------------------------------------------------
MApi_XC_WaitInputVSync_U2(void * pInstance,MS_U8 u8NumVSyncs,MS_U16 u16Timeout,SCALER_WIN eWindow)2508 MS_U8 MApi_XC_WaitInputVSync_U2(void* pInstance, MS_U8 u8NumVSyncs, MS_U16 u16Timeout, SCALER_WIN eWindow)
2509 {
2510     MS_U8 u8InputVsyncTime;
2511     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2512 
2513     _XC_ENTRY(pInstance);
2514     u8InputVsyncTime = MDrv_XC_wait_input_vsync(pInstance, u8NumVSyncs, u16Timeout, eWindow);
2515     //return MDrv_XC_wait_input_vsync(u8NumVSyncs, u16Timeout, eWindow);
2516     _XC_RETURN(pInstance);
2517     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2518     return u8InputVsyncTime;
2519 }
2520 
MApi_XC_WaitInputVSync(MS_U8 u8NumVSyncs,MS_U16 u16Timeout,SCALER_WIN eWindow)2521 MS_U8 MApi_XC_WaitInputVSync(MS_U8 u8NumVSyncs, MS_U16 u16Timeout, SCALER_WIN eWindow)
2522 {
2523     if (pu32XCInst == NULL)
2524     {
2525         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2526         return 0xFF;
2527     }
2528 
2529     stXC_SET_WAIT_INPUT_VSYNC XCArgs;
2530     XCArgs.u8NumVSyncs = u8NumVSyncs;
2531     XCArgs.u16Timeout = u16Timeout;
2532     XCArgs.eWindow = eWindow;
2533     XCArgs.u8ReturnValue = 0xFF;
2534 
2535     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_WAIT_INPUT_VSYNC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2536     {
2537         printf("Obtain XC engine fail\n");
2538         return 0xFF;
2539     }
2540     else
2541     {
2542         return XCArgs.u8ReturnValue;
2543     }
2544 }
2545 
2546 //-------------------------------------------------------------------------------------------------
2547 /// wait for output sync
2548 /// @param  u8NumVSyncs        \b IN: the number of VSync we are going to wait
2549 /// @param  u16Timeout         \b IN: time out
2550 /// @return @ref MS_U8 retun the number of left Vsync if timeout
2551 //-------------------------------------------------------------------------------------------------
MApi_XC_WaitOutputVSync_U2(void * pInstance,MS_U8 u8NumVSyncs,MS_U16 u16Timeout,SCALER_WIN eWindow)2552 MS_U8 MApi_XC_WaitOutputVSync_U2(void* pInstance, MS_U8 u8NumVSyncs, MS_U16 u16Timeout, SCALER_WIN eWindow)
2553 {
2554     MS_U8 u8OutputVsyncTime;
2555     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2556     _XC_ENTRY(pInstance);
2557     u8OutputVsyncTime = MDrv_XC_wait_output_vsync(pInstance, u8NumVSyncs, u16Timeout, eWindow);
2558     //return MDrv_XC_wait_output_vsync(u8NumVSyncs, u16Timeout, eWindow);
2559     _XC_RETURN(pInstance);
2560     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2561     return u8OutputVsyncTime;
2562 }
2563 
MApi_XC_WaitOutputVSync(MS_U8 u8NumVSyncs,MS_U16 u16Timeout,SCALER_WIN eWindow)2564 MS_U8 MApi_XC_WaitOutputVSync(MS_U8 u8NumVSyncs, MS_U16 u16Timeout, SCALER_WIN eWindow)
2565 {
2566     if (pu32XCInst == NULL)
2567     {
2568         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2569         return 0xFF;
2570     }
2571 
2572     stXC_SET_WAIT_OUTPUT_VSYNC XCArgs;
2573     XCArgs.u8NumVSyncs = u8NumVSyncs;
2574     XCArgs.u16Timeout = u16Timeout;
2575     XCArgs.eWindow = eWindow;
2576     XCArgs.u8ReturnValue = 0xFF;
2577 
2578     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_WAIT_OUTPUT_VSYNC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2579     {
2580         printf("Obtain XC engine fail\n");
2581         return 0xFF;
2582     }
2583     else
2584     {
2585         return XCArgs.u8ReturnValue;
2586     }
2587 }
2588 
2589 //-------------------------------------------------------------------------------------------------
2590 /// wait for output sync
2591 /// @param  u8NumVSyncs        \b IN: the number of VSync we are going to wait
2592 /// @param  u16Timeout         \b IN: time out
2593 /// @return @ref MS_U8 retun the number of left Vsync if timeout
2594 //-------------------------------------------------------------------------------------------------
MDrv_XC_WaitOutputVSync(void * pInstance,MS_U8 u8NumVSyncs,MS_U16 u16Timeout,SCALER_WIN eWindow)2595 MS_U8 MDrv_XC_WaitOutputVSync(void *pInstance, MS_U8 u8NumVSyncs, MS_U16 u16Timeout, SCALER_WIN eWindow)
2596 {
2597     MS_U8 u8OutputVsyncTime;
2598     u8OutputVsyncTime = MDrv_XC_wait_output_vsync(pInstance, u8NumVSyncs, u16Timeout, eWindow);
2599     return u8OutputVsyncTime;
2600 }
2601 
msAPI_Scaler_Field_Detect(void * pInstance,INPUT_SOURCE_TYPE_t enInputSrcType,EN_VIDEO_SCAN_TYPE enScanType,SCALER_WIN eWindow)2602 void msAPI_Scaler_Field_Detect(void *pInstance, INPUT_SOURCE_TYPE_t enInputSrcType, EN_VIDEO_SCAN_TYPE enScanType, SCALER_WIN eWindow)
2603 {
2604 
2605     MS_U8 reg_IP1F2_1D, reg_IP1F2_23;
2606     MS_U16 reg_IP1F2_21;
2607     MS_U16 u16Vtt = 0;
2608 
2609     // Note:
2610     // IP1F2_1D[13]: Enable auto no signal filter mode.
2611     // This functionality is to improve timing detection stability.
2612 
2613     if(IsSrcTypeDigitalVD(enInputSrcType))
2614     {
2615         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "VD \n");
2616         reg_IP1F2_1D = 0xA1;
2617         reg_IP1F2_21 = 0x0403;
2618         reg_IP1F2_23 = 0x30;
2619     }
2620     else if(IsSrcTypeDTV(enInputSrcType) || IsSrcTypeStorage(enInputSrcType))
2621     {
2622         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "DTV ");
2623         if (enScanType == SCAN_INTERLACE)
2624         {
2625             reg_IP1F2_1D = 0xA1;
2626             reg_IP1F2_21 = 0x0403;
2627             reg_IP1F2_23 = 0x30;
2628             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Interlace\n");
2629         }
2630         else
2631         {
2632             reg_IP1F2_1D = 0x21;
2633             reg_IP1F2_21 = 0x0400;
2634             reg_IP1F2_23 = 0x00;
2635             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Progressive\n");
2636         }
2637     }
2638     else if (IsSrcTypeHDMI(enInputSrcType))
2639     {
2640 
2641         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "HDMI ");
2642         if ((enScanType == SCAN_INTERLACE)
2643             || (MDrv_SC_GetInterlaceInPModeStatus(pInstance, eWindow)
2644                && (MDrv_XC_GetForceiSupportType(pInstance) == ForceI_SW)))
2645         {
2646             //HDMI can get i/p mode info. from header,so we dont have to set i/p mode forecely.
2647             //reg_IP1F2_21 = 0x0003;      // enable DE -> no field invert, disable DE -> use field invert
2648 
2649             //sw patch: HDMI 720*480i->720*400p , v de will become twice
2650             //0x20 means that xc ip will detect this timing as i mode if( VTT < (0x20<<4) )
2651             //it will be more faster to detect i mode
2652             //But in this case, 720*400p will be treat as i mode, and then v de will become twice
2653             //So, we decrease the threshold to zero.
2654             //reg_IP1F2_23 = 0x20;
2655             reg_IP1F2_1D = 0x21;
2656             reg_IP1F2_21 = 0x0000;      // enable DE -> no field invert, disable DE -> use field invert
2657             reg_IP1F2_23 = 0x00;
2658             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Interlace\n");
2659 
2660             u16Vtt = MDrv_SC_ip_get_verticaltotal(pInstance, eWindow);
2661             if((u16Vtt/2)%2 )
2662             {
2663                 reg_IP1F2_21 |= BIT(8);
2664             }
2665             else
2666             {
2667                 reg_IP1F2_21 &= ~BIT(8);
2668             }
2669         }
2670         else
2671         {
2672             reg_IP1F2_1D = 0x21;
2673             reg_IP1F2_21 = 0x0000;
2674             reg_IP1F2_23 = 0x00;
2675             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Progressive\n");
2676         }
2677 
2678         reg_IP1F2_21 |= BIT(12);
2679 
2680         if( (MDrv_XC_GetHdmiSyncMode(pInstance) == HDMI_SYNC_HV)
2681           &&(enScanType == SCAN_INTERLACE) )
2682         {
2683             XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2684             UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2685             MS_U16 u16Cur_IP1F2_21Val = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_21_L);
2686             if( u16Cur_IP1F2_21Val&0xC000 )
2687             {
2688                 if( reg_IP1F2_21&BIT(8) )
2689                 {
2690                     reg_IP1F2_21 &= ~BIT(8);
2691                 }
2692                 else
2693                 {
2694                     reg_IP1F2_21 |= BIT(8);
2695                 }
2696                 //printf("daniel_test patch REG_SC_BK01_21_L: FieldInvert\n");
2697             }
2698             else
2699             {
2700             }
2701         }
2702 
2703     }
2704     else if(IsSrcTypeVga(enInputSrcType))
2705     {
2706         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "DSUB ");
2707         if (enScanType == SCAN_INTERLACE)
2708         {
2709             reg_IP1F2_1D = 0x21;
2710             reg_IP1F2_21 = 0x0103;
2711             reg_IP1F2_23 = 0x10;
2712             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Interlace\n");
2713         }
2714         else
2715         {
2716             reg_IP1F2_1D = 0x21;
2717             reg_IP1F2_21 = 0x0000;
2718             reg_IP1F2_23 = 0x00;
2719             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "-> Progressive\n");
2720         }
2721     }
2722     else if (IsSrcTypeCapture(enInputSrcType))
2723     {
2724         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "DIP ");
2725         reg_IP1F2_21 = 0x0101;//IP1 sometimes will detect opcapture to interlace,we force it to progressive
2726         reg_IP1F2_1D = 0xA1;
2727         reg_IP1F2_23 = 0x08; //0x20  // Vtt will use "IP1F2_23 * 16" as lower bound.
2728     }
2729     else // YPbPr
2730     {
2731         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "YPbPr ");
2732         if(MDrv_XC_ip_GetEuroHdtvStatus(pInstance, MAIN_WINDOW) == EURO_AUS_HDTV_NORMAL)
2733         {
2734             reg_IP1F2_21 = 0x0100;
2735         }
2736         else
2737         {
2738             reg_IP1F2_21 = 0x0000;
2739         }
2740         reg_IP1F2_1D = 0xA1;
2741         reg_IP1F2_23 = 0x08; //0x20  // Vtt will use "IP1F2_23 * 16" as lower bound.
2742     }
2743 
2744 
2745     MDrv_SC_setfield(pInstance, reg_IP1F2_1D, reg_IP1F2_21, reg_IP1F2_23, eWindow);
2746 
2747 }
2748 
2749 //-------------------------------------------------------------------------------------------------
2750 /// Get the specific window's sync status
2751 /// @param  eCurrentSrc             \b IN: the current input source
2752 /// @param  sXC_Sync_Status         \b OUT:store the sync status
2753 /// @param  eWindow                 \b IN: which window we are going to get
2754 //-------------------------------------------------------------------------------------------------
MApi_XC_GetSyncStatus_U2(void * pInstance,INPUT_SOURCE_TYPE_t eCurrentSrc,XC_IP_SYNC_STATUS * sXC_Sync_Status,SCALER_WIN eWindow)2755 void MApi_XC_GetSyncStatus_U2(void* pInstance, INPUT_SOURCE_TYPE_t eCurrentSrc, XC_IP_SYNC_STATUS *sXC_Sync_Status, SCALER_WIN eWindow)
2756 {
2757     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2758     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2759     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2760     _XC_ENTRY(pInstance);
2761     MDrv_XC_GetSyncStatus(pInstance, eCurrentSrc, sXC_Sync_Status, eWindow);
2762     _XC_RETURN(pInstance);
2763     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2764     return;
2765 }
2766 
MApi_XC_GetSyncStatus(INPUT_SOURCE_TYPE_t eCurrentSrc,XC_IP_SYNC_STATUS * sXC_Sync_Status,SCALER_WIN eWindow)2767 void MApi_XC_GetSyncStatus(INPUT_SOURCE_TYPE_t eCurrentSrc, XC_IP_SYNC_STATUS *sXC_Sync_Status, SCALER_WIN eWindow)
2768 {
2769     if (pu32XCInst == NULL)
2770     {
2771         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
2772         return;
2773     }
2774 
2775     stXC_GET_SYNC_STATUS XCArgs;
2776     XCArgs.eCurrentSrc = eCurrentSrc;
2777     XCArgs.sXC_Sync_Status = sXC_Sync_Status;
2778     XCArgs.eWindow = eWindow;
2779 
2780     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_SYNC_STATUS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
2781     {
2782         printf("Obtain XC engine fail\n");
2783         return;
2784     }
2785     else
2786     {
2787         return;
2788     }
2789 }
2790 
MDrv_XC_GetSyncStatus(void * pInstance,INPUT_SOURCE_TYPE_t eCurrentSrc,XC_IP_SYNC_STATUS * sXC_Sync_Status,SCALER_WIN eWindow)2791 void MDrv_XC_GetSyncStatus(void *pInstance, INPUT_SOURCE_TYPE_t eCurrentSrc, XC_IP_SYNC_STATUS *sXC_Sync_Status, SCALER_WIN eWindow)
2792 {
2793     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2794     E_MUX_INPUTPORT _enPort = MDrv_XC_Mux_GetHDMIPort(pInstance, eCurrentSrc);
2795 
2796     MDrv_XC_ip_get_sync_status(pInstance, sXC_Sync_Status, _enPort , eWindow);
2797     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2798 }
2799 
2800 //-------------------------------------------------------------------------------------------------
2801 /// Set input source type
2802 /// @param  enInputSourceType      \b IN: which input source typewe are going to set
2803 /// @param  eWindow                \b IN: which window we are going to set
2804 /// @return void
2805 //-------------------------------------------------------------------------------------------------
MApi_XC_SetInputSource_U2(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,SCALER_WIN eWindow)2806 void MApi_XC_SetInputSource_U2( void* pInstance, INPUT_SOURCE_TYPE_t enInputSourceType,SCALER_WIN eWindow )
2807 {
2808     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
2809     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2810     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2811     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2812     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
2813     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2814     if( pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[eWindow] == enInputSourceType)
2815     {
2816         printf("MApi_XC_SetInputSource[Win %u] return because old src %d -> %d\n"
2817                 , eWindow
2818                 , pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[eWindow], enInputSourceType);
2819         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2820         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2821         return;
2822     }
2823     else
2824     {
2825         pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[eWindow] = enInputSourceType;
2826     }
2827 
2828 #ifdef UFO_XC_HDR
2829 #if (UFO_XC_HDR_VERSION == 2)
2830     MDrv_XC_HDR_SetInputSource(pInstance, enInputSourceType);
2831 #endif
2832 #endif
2833 
2834     MS_U8 u8InputSrcSel, u8SyncSel, u8VideoSel=0, u8isYPbPr, u8HankShakingMD;
2835 
2836     //Disable new mode interlaced detect before set input source
2837     MDrv_XC_SetNewModeInterlacedDetect(pInstance, DISABLE, 0, DISABLE, FALSE, FALSE, eWindow);
2838 
2839     MDrv_SC_ForceInterlaceInPMode(pInstance, DISABLE,eWindow);
2840     //IP1 sometimes will detect opcapture to interlace,we force it to progressive
2841     Hal_SC_ip_set_user_def_interlace_status(pInstance, DISABLE, DISABLE,eWindow);
2842 
2843     _XC_ENTRY(pInstance);
2844 
2845 #if SUPPORT_IP_HDMI_FOR_HV_MODE
2846     // Should disable "pixel repetition" for other source
2847     if(!(IsSrcTypeHDMI(enInputSourceType) || IsSrcTypeDVI(enInputSourceType)))
2848     {
2849         Hal_SC_ip_set_fir_down_sample_divider(pInstance, DISABLE,0x00,eWindow); //Reset Pixel repetition, when switch hv mode
2850     }
2851 #endif
2852 
2853     if(IsSrcTypeVga(enInputSourceType))
2854     {
2855         u8InputSrcSel = IP_ANALOG1;
2856         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2857         u8isYPbPr = FALSE;
2858         u8HankShakingMD = FALSE;
2859         MApi_XC_ADC_SwitchSource(pInstance,1); // Force ADC to reset after source switch
2860     }
2861     else if(IsSrcTypeYPbPr(enInputSourceType))
2862     {
2863         u8InputSrcSel = IP_ANALOG1;
2864         u8SyncSel = (SYNC_ON_GREEN << 1) | SOG;
2865         u8isYPbPr = TRUE;
2866         u8HankShakingMD = FALSE;
2867         MApi_XC_ADC_SwitchSource(pInstance,1); // Force ADC to reset after source switch
2868     }
2869     else if(IsSrcTypeHDMI(enInputSourceType))
2870     {
2871 #if SUPPORT_IP_HDMI_FOR_HV_MODE
2872         // set to DE mode to sync with IP_HDMI below, to make system status sync.
2873         // to fix hdmi 720p-->atv-->720p, then MDrv_XC_Switch_DE_HV_Mode_By_Timing()
2874         // won't set IP_VIDEO.
2875         //first time bootup and do 3d conversion, sub window will be set to hdmi also.
2876         //and sub window will override the HV mode of main. wrong
2877         //HV mode will be taken as a whole system feature, not main/sub window's
2878         //beside, we have only one HDMI engine.
2879         if(!((eWindow == SUB_WINDOW) && (IsSrcTypeHDMI(pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[MAIN_WINDOW]))))
2880         {
2881             MDrv_XC_SetHdmiSyncMode(pInstance, HDMI_SYNC_DE);
2882         }
2883         u8InputSrcSel = IP_HDMI;
2884         u8VideoSel = IP_HDMI;
2885         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2886 #else
2887         if( MDrv_XC_GetHdmiSyncMode(pInstance) == HDMI_SYNC_DE)
2888         {
2889             u8InputSrcSel = IP_HDMI;
2890             u8VideoSel = IP_HDMI;
2891             u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2892         }
2893         else
2894         {
2895             u8InputSrcSel = IP_VIDEO;
2896             u8VideoSel = IP_MST_VD_A;
2897             u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2898         }
2899 #endif
2900         u8isYPbPr = TRUE;
2901         u8HankShakingMD = FALSE;
2902 
2903     }
2904     else if(IsSrcTypeDigitalVD(enInputSourceType))
2905     {
2906         u8InputSrcSel = IP_VIDEO;
2907         u8VideoSel = IP_MST_VD_A;
2908         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2909         u8isYPbPr = TRUE;
2910         u8HankShakingMD = FALSE;
2911     }
2912     #ifdef __EXTVD
2913     else if(IsUseExtVDPort(enInputPortType))
2914     {
2915         u8InputSrcSel = IP_VIDEO;
2916         u8VideoSel = IP_CCIR656_A;
2917         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2918         u8isYPbPr = TRUE;
2919         u8HankShakingMD = FALSE;
2920     }
2921     #endif
2922     else if(IsSrcTypeDTV(enInputSourceType) || (IsSrcTypeStorage(enInputSourceType)))
2923     {
2924         u8InputSrcSel = IP_VIDEO;
2925         u8VideoSel = IP_MST_VD_A;
2926         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2927         u8isYPbPr = TRUE;
2928         u8HankShakingMD = TRUE;
2929     }
2930     else if(IsSrcTypeCapture(enInputSourceType))
2931     {
2932         u8InputSrcSel = IP_DVI; // DIP uses IP_HDTV
2933         u8VideoSel = IP_CCIR656_A;
2934         u8SyncSel = (AUTO_DETECT << 1) | CSYNC;
2935         u8isYPbPr = FALSE;
2936         u8HankShakingMD = FALSE;
2937         MDrv_SC_ip_set_input_source(pInstance, u8InputSrcSel, u8SyncSel, u8VideoSel, u8isYPbPr, eWindow);
2938         MDrv_SC_ip_set_handshaking_md(pInstance, u8HankShakingMD, eWindow);
2939         MDrv_SC_ip_set_input_sync_reference_edge( pInstance, TAILING_EDGE, TAILING_EDGE, eWindow );
2940         MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
2941         //IP1 sometimes will detect opcapture to interlace,we force it to progressive
2942         Hal_SC_ip_set_user_def_interlace_status(pInstance, ENABLE, DISABLE, eWindow);
2943         gSrcInfo[eWindow].enInputSourceType = enInputSourceType;
2944         _XC_RETURN(pInstance);
2945         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2946         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2947 
2948         return;
2949     }
2950     else
2951     {
2952         printf("Unknow Input Type \n");
2953         //main: vga, switch to browser(storage), select sub source to ypbpr
2954         //sub display garbage. because main's source select is still in vga status, conflict.
2955         //Thus, we need to set main to a resevered on: IP_HDTV in mapi_video_base::finalize()
2956         // of MApi_XC_SetInputSource(INPUT_SOURCE_NONE, SDK2DriverScalerWinTypeTrans(m_enDstWin));
2957         u8InputSrcSel = IP_HDTV; //by CC, treat IP_HDTV as reserved
2958         u8VideoSel = 0;
2959         u8SyncSel = 0;
2960         u8isYPbPr = 0;
2961         u8HankShakingMD = 0;
2962         MDrv_SC_ip_set_input_source(pInstance, u8InputSrcSel, u8SyncSel, u8VideoSel, u8isYPbPr, eWindow);
2963         //IP1 sometimes will detect opcapture to interlace,we force it to progressive
2964         if( IsSrcTypeCapture(enInputSourceType))
2965         {
2966             Hal_SC_ip_set_user_def_interlace_status(pInstance, ENABLE, DISABLE, eWindow);
2967         }
2968         _XC_RETURN(pInstance);
2969         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
2970         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
2971         return;
2972     }
2973 
2974     MDrv_SC_ip_set_input_source(pInstance, u8InputSrcSel, u8SyncSel, u8VideoSel, u8isYPbPr, eWindow);
2975     if(IsSrcTypeVga(enInputSourceType))
2976     {
2977         MDrv_SC_ip_set_image_wrap(pInstance,  DISABLE, DISABLE, eWindow );
2978     }
2979     else
2980     {
2981         MDrv_SC_ip_set_image_wrap(pInstance,  ENABLE, ENABLE, eWindow );
2982     }
2983     MDrv_SC_ip_set_handshaking_md(pInstance, u8HankShakingMD, eWindow);
2984     MDrv_SC_ip_set_de_bypass_mode(pInstance, DISABLE, eWindow); // fix HDMI <-> component switch problems
2985 
2986     if(IsSrcTypeVga(enInputSourceType))
2987     {
2988         MDrv_SC_ip_set_input_sync_reference_edge(pInstance, LEADING_EDGE, TAILING_EDGE, eWindow );
2989         MDrv_SC_ip_set_input_vsync_delay(pInstance, DELAY_QUARTER_HSYNC, eWindow );
2990         MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
2991         MDrv_ip_set_input_10bit(pInstance, ENABLE, eWindow );
2992 
2993         MDrv_SC_ip_set_coast_input(pInstance, PC_SOURCE, eWindow );
2994         MDrv_SC_ip_set_ms_filter(pInstance, ENABLE,0,eWindow);
2995         MDrv_SC_ip_set_coast_window(pInstance, 0x0C, 0x0C, eWindow );
2996         MDrv_SC_ip_set_input_sync_sample_mode(pInstance, NORMAL_MODE, eWindow );
2997         MDrv_SC_ip_set_post_glitch_removal(pInstance, DISABLE, 0x00, eWindow );
2998     }
2999     else if(IsSrcTypeYPbPr(enInputSourceType))
3000     {
3001         MDrv_SC_ip_set_input_sync_reference_edge(pInstance, LEADING_EDGE, TAILING_EDGE, eWindow );
3002         MDrv_SC_ip_set_input_vsync_delay(pInstance, NO_DELAY, eWindow );
3003         MDrv_SC_ip_set_ms_filter(pInstance, ENABLE,0,eWindow);
3004         MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
3005         MDrv_ip_set_input_10bit(pInstance, ENABLE, eWindow );
3006 
3007         MDrv_SC_ip_set_coast_input(pInstance, COMPONENT_VIDEO, eWindow );
3008         MDrv_SC_ip_set_coast_window(pInstance, 0x0C, 0x0C, eWindow );
3009         MDrv_SC_ip_set_input_sync_sample_mode(pInstance, GLITCH_REMOVAL, eWindow );
3010         MDrv_SC_ip_set_post_glitch_removal(pInstance, ENABLE, 0x01, eWindow );
3011 
3012     #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3013         MDrv_XC_mux_SetScalerIndexInformationToADC(pInstance,(psXCInstPri->u32DeviceID),enInputSourceType);
3014     #endif
3015 
3016     }
3017     else if(IsSrcTypeHDMI(enInputSourceType))
3018     {
3019         MDrv_SC_ip_set_input_sync_reference_edge(pInstance, LEADING_EDGE, TAILING_EDGE, eWindow );
3020         MDrv_SC_ip_set_input_vsync_delay(pInstance, DELAY_QUARTER_HSYNC, eWindow );
3021 #ifdef K3_U2
3022 #else
3023         Hal_HDMI_Set_YUV422to444_Bypass(TRUE);
3024 #endif
3025 
3026         if( MDrv_XC_GetHdmiSyncMode(pInstance) == HDMI_SYNC_DE)
3027         {
3028             MDrv_SC_ip_set_input_vsync_delay(pInstance, DELAY_QUARTER_HSYNC, eWindow );
3029             MDrv_SC_ip_set_de_only_mode(pInstance, ENABLE, eWindow );
3030             MDrv_SC_ip_set_de_bypass_mode(pInstance, DISABLE, eWindow);
3031             MDrv_SC_ip_set_input_sync_sample_mode(pInstance, NORMAL_MODE, eWindow );
3032             MDrv_SC_ip_set_post_glitch_removal(pInstance, ENABLE, 0x07, eWindow );
3033 #ifdef K3_U2
3034             Hal_HDMI_Set_YUV422to444_Bypass(TRUE);
3035 #endif
3036         }
3037         else
3038         {
3039             MDrv_SC_ip_set_input_vsync_delay(pInstance, NO_DELAY, eWindow );
3040             MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
3041             // Use DE as capture window
3042             MDrv_SC_ip_set_de_bypass_mode(pInstance, ENABLE, eWindow);
3043             // Disable scaling for get correct DE.
3044             //MDrv_SC_Enable_PreScaling(FALSE, FALSE, eWindow);
3045             // Set full range capture size for de-bypass mode
3046             //MDrv_SC_SetFullRangeCapture(eWindow);
3047             MDrv_SC_ip_set_input_sync_sample_mode(pInstance, GLITCH_REMOVAL, eWindow );
3048             MDrv_SC_ip_set_post_glitch_removal(pInstance, ENABLE, 0x01, eWindow );
3049 #ifdef K3_U2
3050             Hal_HDMI_Set_YUV422to444_Bypass(FALSE);
3051 #endif
3052         }
3053 
3054         MDrv_ip_set_input_10bit(pInstance, ENABLE, eWindow );
3055 
3056         MDrv_SC_ip_set_ms_filter(pInstance, DISABLE,0,eWindow);
3057 
3058         //MDrv_SC_ip_set_coast_input( PC_SOURCE, eWindow );
3059         MDrv_SC_ip_set_ms_filter(pInstance, DISABLE,0,eWindow);
3060         //MDrv_SC_ip_set_coast_window( 0x0C, 0x0C, eWindow );
3061         MDrv_SC_ip_set_input_sync_sample_mode(pInstance, NORMAL_MODE, eWindow );
3062         MDrv_SC_ip_set_post_glitch_removal(pInstance, ENABLE, 0x07, eWindow );
3063     }
3064     else if(IsSrcTypeDigitalVD(enInputSourceType)
3065     #ifdef __EXTVD
3066     | IsUseExtVDPort(enInputPortType)
3067     #endif
3068     )
3069     {
3070         MDrv_SC_ip_set_input_sync_reference_edge(pInstance, TAILING_EDGE, TAILING_EDGE, eWindow );
3071         MDrv_SC_ip_set_input_vsync_delay(pInstance, DELAY_QUARTER_HSYNC, eWindow );
3072         MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
3073 
3074         #ifdef __EXTVD
3075         if(IsUseExtVDPort(enInputPortType))
3076         {
3077             MS_U16 u16tmp;
3078             MDrv_ip_set_input_10bit(pInstance, DISABLE, eWindow );
3079 
3080             //MDrv_WriteByte(BK_SELECT_00, REG_BANK_IP1F2);
3081             //MDrv_WriteByte(L_BK_IP1F2(0x08), (MDrv_ReadByte(L_BK_IP1F2(0x08)) & 0x7F));
3082             //u16tmp = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_08_L);
3083             //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_08_L, u16tmp & 0x007F, 0x00FF);
3084         }
3085         else
3086         #endif
3087 
3088         {
3089             MDrv_ip_set_input_10bit(pInstance, ENABLE, eWindow );
3090         }
3091         //MDrv_SC_ip_set_coast_input( PC_SOURCE, eWindow );
3092         MDrv_SC_ip_set_ms_filter(pInstance, DISABLE,0,eWindow);
3093         //MDrv_SC_ip_set_coast_window( 0x0C, 0x0C, eWindow );
3094         MDrv_SC_ip_set_input_sync_sample_mode(pInstance, NORMAL_MODE, eWindow );
3095         MDrv_SC_ip_set_post_glitch_removal(pInstance, DISABLE, 0x00, eWindow );
3096     }
3097     else //DTV
3098     {
3099         //set HSYNC reference to leading edge, the capature start will be 1/2 Hsync when input source is from DC0/DC1
3100         MDrv_SC_ip_set_input_sync_reference_edge(pInstance, LEADING_EDGE, TAILING_EDGE, eWindow );
3101         MDrv_SC_ip_set_input_vsync_delay(pInstance, DELAY_QUARTER_HSYNC, eWindow );
3102         MDrv_SC_ip_set_de_only_mode(pInstance, DISABLE, eWindow );
3103         MDrv_ip_set_input_10bit(pInstance, ENABLE, eWindow );
3104 
3105         //MDrv_SC_ip_set_coast_input( PC_SOURCE, eWindow );
3106         MDrv_SC_ip_set_ms_filter(pInstance, DISABLE,0,eWindow);
3107         //MDrv_SC_ip_set_coast_window( 0x0C, 0x0C, eWindow );
3108         MDrv_SC_ip_set_input_sync_sample_mode(pInstance, NORMAL_MODE, eWindow );
3109         MDrv_SC_ip_set_post_glitch_removal(pInstance, DISABLE, 0x00, eWindow );
3110     }
3111 
3112     // set  h0027 [2] : true to enable DE only mode Glitch Protect for position
3113     // to fix HDMI 720P YUV422 HStart error & HDE lack of 1
3114     if (IsSrcTypeHDMI(enInputSourceType))
3115         MDrv_SC_ip_set_DE_Mode_Glitch(pInstance, 0x24 , eWindow ); // VSync glitch removal with line less than 2(DE only)
3116     else
3117         MDrv_SC_ip_set_DE_Mode_Glitch(pInstance, 0x04 , eWindow ); // CHANNEL_ATTRIBUTE function control
3118 
3119     msAPI_Scaler_Field_Detect(pInstance, enInputSourceType, SCAN_AUTO, eWindow );
3120 
3121     MDrv_XC_reset_ip(pInstance, eWindow );
3122 
3123     gSrcInfo[eWindow].enInputSourceType = enInputSourceType;
3124 
3125 #if 0
3126     if(g_bIMMESWITCH_DVI_POWERSAVING)
3127     {
3128         if((enInputSourceType < INPUT_SOURCE_HDMI || enInputSourceType > INPUT_SOURCE_HDMI4))
3129             MDrv_DVI_ForceAllPortsEnterPS();
3130         else
3131             u8PSDVIStableCount[enInputSourceType - INPUT_SOURCE_HDMI] = 0;
3132     }
3133 #endif
3134     /// no delay
3135     gSrcInfo[eWindow].stStatusnodelay.enInputSourceType = enInputSourceType;
3136     _XC_RETURN(pInstance);
3137     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3138     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
3139 
3140 
3141 
3142 
3143 }
3144 
MApi_XC_SetInputSource(INPUT_SOURCE_TYPE_t enInputSourceType,SCALER_WIN eWindow)3145 void MApi_XC_SetInputSource( INPUT_SOURCE_TYPE_t enInputSourceType,SCALER_WIN eWindow )
3146 {
3147     if (pu32XCInst == NULL)
3148     {
3149         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
3150         return;
3151     }
3152 
3153     stXC_SET_INPUTSOURCE XCArgs;
3154     XCArgs.enInputSourceType = enInputSourceType;
3155     XCArgs.eWindow = eWindow;
3156 
3157     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_INPUTSOURCE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
3158     {
3159         printf("Obtain XC engine fail\n");
3160         return;
3161     }
3162     else
3163     {
3164         return;
3165     }
3166 }
3167 
msAPI_Scaler_SetMode(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)3168 static void msAPI_Scaler_SetMode(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType, XC_InternalStatus *pSrcInfo, SCALER_WIN eWindow )
3169 {
3170     MS_BOOL bFBL = pSrcInfo->bFBL;
3171     MS_BOOL bInterlace = pSrcInfo->bInterlace;
3172     MS_BOOL bUseYUVSpace = FALSE;
3173     MS_U8 interlace_type = 0;
3174     XC_INITMISC stXC_Init_Misc;
3175     memset(&stXC_Init_Misc,0,sizeof(XC_INITMISC));
3176 
3177     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3178     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3179     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3180     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
3181     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3182     //----------------------------------------------------
3183     // Setup Memory format
3184     //----------------------------------------------------
3185     if(pXCResourcePrivate->stdrvXC_MVideo.s_eMemFmt[eWindow] == E_MS_XC_MEM_FMT_AUTO)
3186     {
3187         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "E_MS_XC_MEM_FMT_AUTO\n");
3188         if(!bInterlace &&
3189           ((IsSrcTypeHDMI(enInputSourceType) && !pXCResourcePrivate->stdrv_HDMI.enStatus_info.b_St_HDMI_Mode) || // DVI plugged into HDMI connector
3190           IsSrcTypeVga(enInputSourceType)  ) )
3191         {   // always keep memory foramt to 444 for corresponding to Y/C post-scaling filter
3192             pSrcInfo->bMemFmt422 = FALSE;
3193         }
3194         else
3195         {   // if input source is 422, HW will convert to 444 automatically
3196             pSrcInfo->bMemFmt422 = TRUE;
3197         }
3198     }
3199     else
3200     {
3201         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "E_MS_XC_MEM_FMT_422\n");
3202         if(pXCResourcePrivate->stdrvXC_MVideo.s_eMemFmt[eWindow] == E_MS_XC_MEM_FMT_422)
3203             pSrcInfo->bMemFmt422 = TRUE;
3204         else
3205             pSrcInfo->bMemFmt422 = FALSE;
3206     }
3207     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR); //K3_PQ
3208 
3209     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MemFmt422=%u\n", (MS_U16)pSrcInfo->bMemFmt422);
3210 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6)||(HW_DESIGN_4K2K_VER == 7))
3211     if(!MDrv_XC_Is_SupportSWDS(pInstance))
3212     {
3213 #ifdef ENABLE_TV_SC2_PQ
3214         if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3215 #endif
3216         {
3217             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc == NULL)
3218                 bUseYUVSpace = 0;
3219             else
3220 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3221                 bUseYUVSpace = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW,
3222                                              pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3223 #else
3224                 bUseYUVSpace = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc(eWindow == SUB_WINDOW ? PQ_SUB_WINDOW : PQ_MAIN_WINDOW,
3225                                              pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3226 #endif
3227         }
3228 #ifdef ENABLE_TV_SC2_PQ
3229         else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3230         {
3231             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc_ex == NULL)
3232                 bUseYUVSpace = 0;
3233             else
3234                 bUseYUVSpace = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc_ex(psXCInstPri->u32DeviceID, eWindow == SUB_WINDOW ? PQ_SUB_WINDOW : PQ_MAIN_WINDOW,
3235                                               pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3236         }
3237 #endif
3238 
3239 #ifdef UFO_XC_HDR
3240 #if (UFO_XC_HDR_VERSION == 2)
3241         if ((pXCResourcePrivate->stdrvXC_Display._bEnableHDR == ENABLE) && IsSrcTypeHDMI(enInputSourceType))
3242         {
3243             // since Dolby HDR will fake as RGB but actually YUV content, we have to set our color space as YUV.
3244             pSrcInfo->bUseYUVSpace = TRUE;
3245         }
3246         else
3247 #endif
3248 #endif
3249         {
3250             if (bUseYUVSpace)
3251             {
3252                 pSrcInfo->bUseYUVSpace = TRUE;
3253              }
3254             else
3255             {
3256                 pSrcInfo->bUseYUVSpace = FALSE;
3257             }
3258         }
3259 
3260 #ifdef ENABLE_TV_SC2_PQ
3261         if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3262 #endif
3263         {
3264             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt == NULL)
3265                 pSrcInfo->bMemYUVFmt =  TRUE;
3266             else
3267 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3268                 pSrcInfo->bMemYUVFmt = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW,
3269                                           pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3270 #else
3271                 pSrcInfo->bMemYUVFmt = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt(eWindow == SUB_WINDOW ? PQ_SUB_WINDOW : PQ_MAIN_WINDOW,
3272                                           pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3273 #endif
3274         }
3275 #ifdef ENABLE_TV_SC2_PQ
3276         else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3277         {
3278             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt_ex == NULL)
3279                 pSrcInfo->bMemYUVFmt =  TRUE;
3280             else
3281                 pSrcInfo->bMemYUVFmt = s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt_ex(psXCInstPri->u32DeviceID, eWindow == SUB_WINDOW ? PQ_SUB_WINDOW : PQ_MAIN_WINDOW,
3282                                           pSrcInfo->bForceRGBin == ENABLE ? PQ_FOURCE_COLOR_RGB : PQ_FOURCE_COLOR_DEFAULT);
3283         }
3284 #endif
3285 
3286         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "bMemYUVFmt=%u, RGBin=%u\n", pSrcInfo->bMemYUVFmt, pSrcInfo->bForceRGBin);
3287 
3288         if((pSrcInfo->bMemYUVFmt != TRUE) && (eWindow == SUB_WINDOW)) //IP_CSC output is RGB, so skip 444 to 422
3289         {
3290             pSrcInfo->bMemFmt422 = FALSE;//Now, only care about Sub case to reduce side effect
3291         }
3292 
3293         MDrv_XC_GetMISCStatus(pInstance, &stXC_Init_Misc);
3294         if (stXC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_PQ_SKIP_PCMODE_NEWFLOW)
3295         {
3296             //if(HDMI/DVI RGB) set to 444
3297             if(!pSrcInfo->bMemYUVFmt && ( IsSrcTypeHDMI(enInputSourceType) || IsSrcTypeDVI(enInputSourceType) ))
3298             {
3299                 pSrcInfo->bMemFmt422 = FALSE;
3300             }
3301         }
3302         //-------------------------------------------
3303         // Set De-interlaced mode and Memory format
3304         //-------------------------------------------
3305         //printf("==> Set PQ MEMORY Mode: %d\n", eWindow);
3306 
3307 #ifdef K3_U2
3308         // Tempararily not dumping MADi PQ table in seamless zapping
3309         if((Hal_SC_GetSeamlessZappingStatus(pInstance, eWindow)) && (Hal_SC_get_freezeimg(pInstance, eWindow)))
3310         {
3311             Hal_SC_SetPX2MemFormat(pInstance, eWindow);
3312             interlace_type = PQ_DEINT_3DDI_HISTORY;
3313             pSrcInfo->u8BitPerPixel = 24;
3314 
3315             //PQ_IP_MemFormat_Main 422MF
3316             HAL_SC_set_memory_bit_fmt(pInstance,FALSE,FALSE);
3317             //444 to 422 (PQ_IP_444To422_Main) (on)
3318             HAL_SC_ip_set_444to422_filter_mod(pInstance,TRUE);
3319             //422To444(PQ_IP_422To444_Main on)
3320             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_0C_L, 0x80 ,0x0080);
3321         }
3322         else
3323         {
3324             if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID) // SC0
3325             {
3326                 if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat == NULL)
3327                     interlace_type = 0;
3328                 else
3329                     interlace_type = (MS_U8) s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat(
3330                         eWindow == SUB_WINDOW ?
3331                         PQ_SUB_WINDOW :
3332                         PQ_MAIN_WINDOW,
3333                         pSrcInfo->bMemFmt422,
3334                         bFBL,
3335                         &(pSrcInfo->u8BitPerPixel));
3336             }
3337             else // SC1
3338             {
3339                 Hal_SC_SetPX2MemFormat(pInstance, eWindow);
3340                 interlace_type = PQ_DEINT_3DDI_HISTORY;
3341                 pSrcInfo->u8BitPerPixel = 24;
3342             }
3343         }
3344 #else
3345 #ifdef ENABLE_TV_SC2_PQ
3346         if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3347 #endif
3348         {
3349             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat == NULL)
3350             {
3351 #if (HW_DESIGN_4K2K_VER == 7)
3352                 // Temperarily add for SC1 to load MADi settings
3353                 if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
3354                 {
3355                     interlace_type = Hal_SC1_LoadMADi(pInstance, eWindow, &(pSrcInfo->u8BitPerPixel));
3356                 }
3357                 else
3358 #endif
3359                 {
3360                     interlace_type = 0;
3361                 }
3362             }
3363             else
3364 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3365                 interlace_type = (MS_U8) s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat(
3366                     (psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW,
3367                     pSrcInfo->bMemFmt422,
3368                     bFBL,
3369                     &(pSrcInfo->u8BitPerPixel));
3370 #else
3371                 interlace_type = (MS_U8) s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat(
3372                     eWindow == SUB_WINDOW ?
3373                     PQ_SUB_WINDOW :
3374                     PQ_MAIN_WINDOW,
3375                     pSrcInfo->bMemFmt422,
3376                     bFBL,
3377                     &(pSrcInfo->u8BitPerPixel));
3378 #endif
3379         }
3380 #ifdef ENABLE_TV_SC2_PQ
3381         else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3382         {
3383             if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat_ex == NULL)
3384                 interlace_type = 0;
3385             else
3386                 interlace_type = (MS_U8) s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat_ex(psXCInstPri->u32DeviceID,
3387                     eWindow == SUB_WINDOW ?
3388                     PQ_SUB_WINDOW :
3389                     PQ_MAIN_WINDOW,
3390                     pSrcInfo->bMemFmt422,
3391                     bFBL,
3392                     &(pSrcInfo->u8BitPerPixel));
3393         }
3394 #endif
3395     }
3396 #endif
3397 #if SUPPORT_SEAMLESS_ZAPPING
3398     Hal_SC_SetPX2MemFormat(pInstance, eWindow);
3399     if (IsVMirrorMode(eWindow))
3400     {
3401         MS_U16 u16IPM3DLRFlags = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L);
3402         // 2D mode
3403         if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_MODE_NONE || MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_MODE_NONE)
3404         {
3405             if(Hal_SC_IsPX2MemFormat(pInstance, eWindow))
3406             {
3407                 if((u16IPM3DLRFlags&BIT(4)) == 0)
3408                 {
3409                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(4), BIT(4));//F2 IPM 3D LR invert
3410                 }
3411             }
3412             else
3413             {
3414                 if((u16IPM3DLRFlags&BIT(4)) == BIT(4))
3415                 {
3416                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0, BIT(4));//F2 IPM 3D LR invert
3417                 }
3418             }
3419         }
3420     }
3421     #endif
3422 #endif
3423 
3424     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR); //K3_PQ
3425 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6)||(HW_DESIGN_4K2K_VER == 7))
3426     if(!MDrv_XC_Is_SupportSWDS(pInstance))
3427     {
3428         pSrcInfo->eDeInterlaceMode = (MS_DEINTERLACE_MODE)interlace_type;
3429     }
3430 #endif
3431     //printf("DI mode =%x, bitPerPixel=%d\n",pSrcInfo->eDeInterlaceMode, pSrcInfo->u8BitPerPixel);
3432     if(bFBL && (pSrcInfo->stDispWin.height != pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height))
3433     {
3434         if(SUPPORT_SPECIAL_FRAMELOCK == FALSE)
3435         {
3436             MDrv_SC_set_std_display_window(pInstance, eWindow);  //only support full screen
3437             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "[FBL]Set to std_display_window(panel size, full screen) \n");
3438         }
3439     }
3440 
3441     _XC_ENTRY(pInstance);
3442 
3443     // set field shift line  // set shift line between even/odd field
3444     MDrv_SC_set_shift_line(pInstance, pSrcInfo->bFBL, pSrcInfo->eDeInterlaceMode, eWindow);
3445 
3446     //------------------------------------
3447     // Setup Delay line
3448     //------------------------------------
3449     /* move to MDrv_SC_Set_LockFreeze_Point()
3450     if(bFBL)
3451     {
3452         pSrcInfo->u8DelayLines = 1;
3453         //printf("[FBL]Set delay line\n");
3454     }
3455     else if( (pSrcInfo->eDeInterlaceMode == MS_DEINT_2DDI_AVG) ||
3456              (pSrcInfo->eDeInterlaceMode == MS_DEINT_2DDI_BOB))
3457     {
3458         pSrcInfo->u8DelayLines = 1;    // 5
3459     }
3460     else
3461     {
3462         pSrcInfo->u8DelayLines = 2;
3463     }
3464 
3465     // Setup delay line
3466     Hal_SC_set_delayline( pSrcInfo->u8DelayLines, eWindow );           // set delay line for trigger point, for 2DDI
3467     */
3468     msAPI_Scaler_Field_Detect(pInstance, enInputSourceType, (pSrcInfo->bInterlace?SCAN_INTERLACE:SCAN_PROGRESSIVE), eWindow );
3469 
3470     //--------------
3471     // PIP related
3472     //--------------
3473     if(PIP_SUPPORTED)
3474     {
3475         if(eWindow == MAIN_WINDOW)
3476         {
3477             if(pSrcInfo->bInterlace == TRUE)
3478             {
3479                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(13), BIT(13));
3480             }
3481             else
3482             {
3483 #if SUPPORT_SEAMLESS_ZAPPING
3484                 // If memory format is PX2 progressive mode, set to use interlace line buffer setting
3485                 if(Hal_SC_IsPX2MemFormat(pInstance, eWindow))
3486                 {
3487                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(13), BIT(13));
3488                 }
3489                 else
3490 #endif
3491                 {
3492                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, 0, BIT(13));
3493                 }
3494             }
3495         }
3496     }
3497     _XC_RETURN(pInstance);
3498     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
3499 }
3500 
3501 //This function is used in internal (as driver), so do not set _XC_SEMAPHORE_ENTRY
_MDrv_XC_Set_PQ_SourceData(void * pInstance,SCALER_WIN eWindow,INPUT_SOURCE_TYPE_t enInputSourceType,XC_InternalStatus * pstXC_WinTime_Info)3502 void _MDrv_XC_Set_PQ_SourceData(void *pInstance,
3503     SCALER_WIN eWindow,
3504     INPUT_SOURCE_TYPE_t enInputSourceType,
3505     XC_InternalStatus *pstXC_WinTime_Info)
3506 {
3507     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3508     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3509     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3510     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3511     PQ_WIN ePQWin;
3512     PQ_INPUT_SOURCE_TYPE enPQSourceType=PQ_INPUT_SOURCE_NONE;
3513     MS_PQ_Mode_Info stPQModeInfo;
3514 
3515     switch (eWindow)
3516     {
3517     default:
3518     case MAIN_WINDOW:
3519         ePQWin = PQ_MAIN_WINDOW;
3520         break;
3521 
3522     case SUB_WINDOW:
3523         ePQWin = PQ_SUB_WINDOW;
3524         break;
3525     }
3526 
3527     if(IsSrcTypeVga(enInputSourceType))
3528     {
3529         enPQSourceType = PQ_INPUT_SOURCE_VGA; // VGA
3530     }
3531     else if(IsSrcTypeATV(enInputSourceType))
3532     {
3533         enPQSourceType = PQ_INPUT_SOURCE_TV; // TV
3534     }
3535     else if(IsSrcTypeDTV(enInputSourceType))
3536     {
3537         enPQSourceType = PQ_INPUT_SOURCE_DTV; //DTV
3538     }
3539     else if(IsSrcTypeAV(enInputSourceType))
3540     {
3541         enPQSourceType = PQ_INPUT_SOURCE_CVBS; // AV
3542     }
3543     else if(IsSrcTypeScart(enInputSourceType))
3544     {
3545         enPQSourceType = PQ_INPUT_SOURCE_SCART; // SCART
3546     }
3547     else if(IsSrcTypeSV(enInputSourceType))
3548     {
3549         enPQSourceType = PQ_INPUT_SOURCE_SVIDEO; // SV
3550     }
3551     else if(IsSrcTypeHDMI(enInputSourceType))
3552     {
3553         enPQSourceType = PQ_INPUT_SOURCE_HDMI; // HDMI
3554     }
3555     else if(IsSrcTypeYPbPr(enInputSourceType))
3556     {
3557         enPQSourceType = PQ_INPUT_SOURCE_YPBPR; // COMP
3558     }
3559     else if(IsSrcTypeJpeg(enInputSourceType))
3560     {
3561         enPQSourceType = PQ_INPUT_SOURCE_JPEG; // JPEG
3562     }
3563     else if(IsSrcTypeStorage(enInputSourceType))
3564     {
3565         enPQSourceType = PQ_INPUT_SOURCE_STORAGE; // Storage
3566     }
3567     else if(IsSrcTypeCapture(enInputSourceType))
3568     {
3569         enPQSourceType = PQ_INPUT_SOURCE_DTV; // Temperarily use DTV
3570     }
3571     else if(enInputSourceType == INPUT_SOURCE_KTV)
3572     {
3573         enPQSourceType = PQ_INPUT_SOURCE_KTV; // KTV
3574     }
3575     else
3576     {
3577         MS_ASSERT(0);
3578     }
3579 
3580     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PQSetSource:Input src=%u, win=%u,\n", enInputSourceType, eWindow);
3581     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "PQSetSource:   PQ src=%u, win=%u\n", enPQSourceType, eWindow);
3582 
3583     stPQModeInfo.bFBL               = pstXC_WinTime_Info->bFBL;
3584     stPQModeInfo.bInterlace         = pstXC_WinTime_Info->bInterlace;
3585     stPQModeInfo.u16input_hsize     = pstXC_WinTime_Info->stCapWin.width;
3586     stPQModeInfo.u16input_vsize     = pstXC_WinTime_Info->stCapWin.height;
3587     stPQModeInfo.u16input_vfreq     = pstXC_WinTime_Info->u16InputVFreq;
3588     stPQModeInfo.u16input_vtotal    = pstXC_WinTime_Info->u16InputVTotal;
3589     stPQModeInfo.u16ouput_vfreq     = pstXC_WinTime_Info->u16InputVFreq;
3590     stPQModeInfo.u16display_hsize   = pstXC_WinTime_Info->stDispWin.width;
3591     stPQModeInfo.u16display_vsize   = pstXC_WinTime_Info->stDispWin.height;
3592 
3593 #ifdef ENABLE_TV_SC2_PQ
3594     if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3595 #endif
3596     {
3597         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo != NULL)
3598         {
3599 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3600             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW, enPQSourceType, &stPQModeInfo);
3601 #else
3602             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo(ePQWin, enPQSourceType, &stPQModeInfo);
3603 #endif
3604         }
3605     }
3606 #ifdef ENABLE_TV_SC2_PQ
3607     else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3608     {
3609         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo_ex != NULL)
3610         {
3611             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo_ex(psXCInstPri->u32DeviceID, ePQWin, enPQSourceType, &stPQModeInfo);
3612         }
3613     }
3614 #endif
3615 
3616 #ifdef ENABLE_TV_SC2_PQ
3617     if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3618 #endif
3619     {
3620         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype != NULL)
3621         {
3622 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3623             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW, enPQSourceType);
3624 #else
3625             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype(ePQWin, enPQSourceType);
3626 #endif
3627         }
3628     }
3629 #ifdef ENABLE_TV_SC2_PQ
3630     else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3631     {
3632         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype_ex != NULL)
3633         {
3634             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype_ex(psXCInstPri->u32DeviceID, ePQWin, enPQSourceType);
3635         }
3636     }
3637 #endif
3638 
3639 }
3640 
3641 ///////////////////////////////////////////////////
3642 /// ADC API
3643 ///////////////////////////////////////////////////
MDrv_XC_ADC_GetPQADCSamplingInfo(void * pInstance,INPUT_SOURCE_TYPE_t enSourceType,XC_InternalStatus * pSrcInfo,PQ_ADC_SAMPLING_INFO * pstPQADCSamplingInfo,SCALER_WIN eWindow)3644 void MDrv_XC_ADC_GetPQADCSamplingInfo(void *pInstance, INPUT_SOURCE_TYPE_t enSourceType, XC_InternalStatus *pSrcInfo, PQ_ADC_SAMPLING_INFO *pstPQADCSamplingInfo, SCALER_WIN eWindow)
3645 {
3646     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3647     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3648     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3649     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3650     //MS_U16 u16Width;//, u16RealWidth;
3651     if ( IsSrcTypeVga(enSourceType) || IsSrcTypeYPbPr(enSourceType) )
3652     {
3653         if(pSrcInfo->bHDuplicate)
3654         {
3655 #ifdef ENABLE_TV_SC2_PQ
3656             if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
3657 #endif
3658             {
3659                 if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl)
3660                 {
3661                     pstPQADCSamplingInfo->enPQSourceType = IsSrcTypeVga(enSourceType) ? PQ_INPUT_SOURCE_VGA : PQ_INPUT_SOURCE_YPBPR;
3662                     pstPQADCSamplingInfo->stPQModeInfo.bFBL               = pSrcInfo->bFBL;
3663                     pstPQADCSamplingInfo->stPQModeInfo.bInterlace         = pSrcInfo->bInterlace;
3664                     pstPQADCSamplingInfo->stPQModeInfo.u16input_hsize     = pSrcInfo->stCapWin.width;
3665                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vsize     = pSrcInfo->stCapWin.height;
3666                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vfreq     = pSrcInfo->u16InputVFreq;
3667                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vtotal    = pSrcInfo->u16InputVTotal;
3668                     pstPQADCSamplingInfo->stPQModeInfo.u16ouput_vfreq     = pSrcInfo->u16InputVFreq;
3669                     pstPQADCSamplingInfo->stPQModeInfo.u16display_hsize   = pSrcInfo->stDispWin.width;
3670                     pstPQADCSamplingInfo->stPQModeInfo.u16display_vsize   = pSrcInfo->stDispWin.height;
3671 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3672                     if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW, E_PQ_IOCTL_ADC_SAMPLING, (void *)pstPQADCSamplingInfo, sizeof(PQ_ADC_SAMPLING_INFO)) == FALSE)
3673 #else
3674                     if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl((PQ_WIN)eWindow, E_PQ_IOCTL_ADC_SAMPLING, (void *)pstPQADCSamplingInfo, sizeof(PQ_ADC_SAMPLING_INFO)) == FALSE)
3675 #endif
3676                     {
3677                         pstPQADCSamplingInfo->u16ratio = 2;
3678                     }
3679                 }
3680                 else
3681                 {
3682                     pstPQADCSamplingInfo->u16ratio = 2;
3683                 }
3684             }
3685 #ifdef ENABLE_TV_SC2_PQ
3686             else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
3687             {
3688                 if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl_ex)
3689                 {
3690                     pstPQADCSamplingInfo->enPQSourceType = IsSrcTypeVga(enSourceType) ? PQ_INPUT_SOURCE_VGA : PQ_INPUT_SOURCE_YPBPR;
3691                     pstPQADCSamplingInfo->stPQModeInfo.bFBL               = pSrcInfo->bFBL;
3692                     pstPQADCSamplingInfo->stPQModeInfo.bInterlace         = pSrcInfo->bInterlace;
3693                     pstPQADCSamplingInfo->stPQModeInfo.u16input_hsize     = pSrcInfo->stCapWin.width;
3694                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vsize     = pSrcInfo->stCapWin.height;
3695                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vfreq     = pSrcInfo->u16InputVFreq;
3696                     pstPQADCSamplingInfo->stPQModeInfo.u16input_vtotal    = pSrcInfo->u16InputVTotal;
3697                     pstPQADCSamplingInfo->stPQModeInfo.u16ouput_vfreq     = pSrcInfo->u16InputVFreq;
3698                     pstPQADCSamplingInfo->stPQModeInfo.u16display_hsize   = pSrcInfo->stDispWin.width;
3699                     pstPQADCSamplingInfo->stPQModeInfo.u16display_vsize   = pSrcInfo->stDispWin.height;
3700 
3701                     if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl_ex(psXCInstPri->u32DeviceID, (PQ_WIN)eWindow, E_PQ_IOCTL_ADC_SAMPLING, (void *)&stPQADCSamplingInfo, sizeof(PQ_ADC_SAMPLING_INFO)) == FALSE)
3702                     {
3703                         pstPQADCSamplingInfo->u16ratio = 2;
3704                     }
3705                 }
3706                 else
3707                 {
3708                     pstPQADCSamplingInfo->u16ratio = 2;
3709                 }
3710             }
3711 #endif
3712             //u16RealWidth = u16Width / pstPQADCSamplingInfo->u16ratio;
3713         }
3714     }
3715 }
3716 
_MDrv_XC_ADC_SetMode(void * pInstance,INPUT_SOURCE_TYPE_t enSourceType,XC_InternalStatus * pSrcInfo,PQ_ADC_SAMPLING_INFO * pstPQADCSamplingInfo,SCALER_WIN eWindow)3717 static void _MDrv_XC_ADC_SetMode(void *pInstance, INPUT_SOURCE_TYPE_t enSourceType, XC_InternalStatus *pSrcInfo, PQ_ADC_SAMPLING_INFO *pstPQADCSamplingInfo, SCALER_WIN eWindow)
3718 {
3719     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3720     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3721     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3722     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3723     //MS_U16 u16Width;//, u16RealWidth;
3724     MS_U16 u16PixClk = 0, u16RealPixClk = 0; // Add the initial value
3725     MS_U16 u16HorizontalTotal;
3726     XC_IP_SYNC_STATUS sXC_Sync_Status;
3727 
3728 
3729     if ( IsSrcTypeVga(enSourceType) || IsSrcTypeYPbPr(enSourceType) )
3730     {
3731         // get sync status
3732         _XC_ENTRY(pInstance);
3733         MDrv_XC_GetSyncStatus(pInstance, enSourceType, &sXC_Sync_Status, eWindow);
3734         _XC_RETURN(pInstance);
3735 
3736         // Set Hsync polarity
3737         MDrv_XC_ADC_hpolarity_setting(pInstance, sXC_Sync_Status.u8SyncStatus & XC_MD_HSYNC_POR_BIT);
3738 
3739         // Set user default phase
3740         MDrv_XC_ADC_SetPhaseEx(pInstance, pSrcInfo->u16DefaultPhase); // setting ADC phase
3741 
3742         //Sog Filter behavior is before the ADC double sampling, so for Sog Filter, we don't need to use
3743         //double horizontal total for the bandwidth calculation.
3744         _XC_ENTRY(pInstance);
3745         u16RealPixClk = MDrv_XC_cal_pixclk(pInstance, pSrcInfo->u16DefaultHtotal, eWindow);
3746         _XC_RETURN(pInstance);
3747 
3748         MDrv_XC_ADC_Reload(pInstance, enSourceType, u16RealPixClk, pSrcInfo->u16DefaultHtotal, pstPQADCSamplingInfo->u16ratio);
3749 
3750         // Get Htt
3751         if(pSrcInfo->bHDuplicate)
3752         {
3753             u16HorizontalTotal = pSrcInfo->u16DefaultHtotal * pstPQADCSamplingInfo->u16ratio; // for better quality
3754         }
3755         else
3756         {
3757             u16HorizontalTotal = pSrcInfo->u16DefaultHtotal;
3758         }
3759 
3760         // Calculate pixel clock, the unit is MHz
3761         _XC_ENTRY(pInstance);
3762         u16PixClk = MDrv_XC_cal_pixclk(pInstance, u16HorizontalTotal, eWindow);
3763         _XC_RETURN(pInstance);
3764 
3765         if (IsSrcTypeVga(enSourceType))
3766         {
3767             // ADC reset, Patch PLL unlock problem.
3768             MDrv_XC_ADC_reset(pInstance, REST_ADC);
3769         }
3770         else
3771         {
3772             MDrv_XC_ADC_clamp_placement_setting(pInstance, u16PixClk);
3773         }
3774 
3775         MDrv_XC_ADC_vco_ctrl(pInstance, IsSrcTypeHDMI(enSourceType), u16PixClk);
3776     }
3777     else
3778     {
3779         MDrv_XC_ADC_Reload(pInstance, enSourceType, u16RealPixClk, pSrcInfo->u16DefaultHtotal, pstPQADCSamplingInfo->u16ratio);
3780     }
3781 }
3782 
MDrv_XC_ADC_SetMode(void * pInstance,INPUT_SOURCE_TYPE_t enSourceType,XC_InternalStatus * pSrcInfo,PQ_ADC_SAMPLING_INFO * pstPQADCSamplingInfo,SCALER_WIN eWindow)3783 void MDrv_XC_ADC_SetMode(void *pInstance, INPUT_SOURCE_TYPE_t enSourceType, XC_InternalStatus *pSrcInfo, PQ_ADC_SAMPLING_INFO *pstPQADCSamplingInfo, SCALER_WIN eWindow)
3784 {
3785     PQ_ADC_SAMPLING_INFO stPQADCSamplingInfo;
3786 
3787     // Give a initial setting.
3788     memset(&stPQADCSamplingInfo,0,sizeof(PQ_ADC_SAMPLING_INFO));
3789     if ( IsSrcTypeVga(enSourceType) || IsSrcTypeYPbPr(enSourceType) )
3790     {
3791         if(pSrcInfo->bHDuplicate)
3792         {
3793             stPQADCSamplingInfo = *pstPQADCSamplingInfo;
3794 
3795         }
3796         else
3797         {
3798             stPQADCSamplingInfo.u16ratio = 1;
3799         }
3800     }
3801     _MDrv_XC_ADC_SetMode(pInstance, enSourceType, pSrcInfo, &stPQADCSamplingInfo, eWindow);
3802 }
3803 
MApi_XC_ADC_SwitchSource(void * pInstance,MS_BOOL bUpdateStatus)3804 void MApi_XC_ADC_SwitchSource(void* pInstance, MS_BOOL bUpdateStatus)
3805 {
3806     MDrv_ADC_SourceSwitch(pInstance,bUpdateStatus);
3807 }
3808 
_Mdrv_XC_CopySetWinInfo(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)3809 static MS_BOOL _Mdrv_XC_CopySetWinInfo(void *pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
3810 {
3811     if(pstXC_SetWin_Info == NULL)
3812     {
3813         return FALSE;
3814     }
3815     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3816     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3817     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3818     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3819     gSrcInfo[eWindow].enInputSourceType     = pstXC_SetWin_Info->enInputSourceType;
3820 
3821     gSrcInfo[eWindow].stCapWin.x            = pstXC_SetWin_Info->stCapWin.x;
3822     gSrcInfo[eWindow].stCapWin.y            = pstXC_SetWin_Info->stCapWin.y;
3823     gSrcInfo[eWindow].stCapWin.width        = pstXC_SetWin_Info->stCapWin.width;
3824     gSrcInfo[eWindow].stCapWin.height       = pstXC_SetWin_Info->stCapWin.height;
3825 
3826     gSrcInfo[eWindow].stDispWin.x           = pstXC_SetWin_Info->stDispWin.x;
3827     gSrcInfo[eWindow].stDispWin.y           = pstXC_SetWin_Info->stDispWin.y;
3828     gSrcInfo[eWindow].stDispWin.width       = pstXC_SetWin_Info->stDispWin.width;
3829     gSrcInfo[eWindow].stDispWin.height      = pstXC_SetWin_Info->stDispWin.height;
3830 
3831     gSrcInfo[eWindow].stCropWin.x           = pstXC_SetWin_Info->stCropWin.x;
3832     gSrcInfo[eWindow].stCropWin.y           = pstXC_SetWin_Info->stCropWin.y;
3833     gSrcInfo[eWindow].stCropWin.width       = pstXC_SetWin_Info->stCropWin.width;
3834     gSrcInfo[eWindow].stCropWin.height      = pstXC_SetWin_Info->stCropWin.height;
3835 
3836     gSrcInfo[eWindow].bInterlace            = pstXC_SetWin_Info->bInterlace;
3837     gSrcInfo[eWindow].bHDuplicate           = pstXC_SetWin_Info->bHDuplicate;
3838     gSrcInfo[eWindow].u16InputVFreq         = pstXC_SetWin_Info->u16InputVFreq;
3839     gSrcInfo[eWindow].u16InputVTotal        = pstXC_SetWin_Info->u16InputVTotal;
3840     gSrcInfo[eWindow].u16DefaultHtotal      = pstXC_SetWin_Info->u16DefaultHtotal;
3841     if(pstXC_SetWin_Info->u16DefaultPhase != 0)
3842     {
3843         gSrcInfo[eWindow].u16DefaultPhase       = pstXC_SetWin_Info->u16DefaultPhase;
3844     }
3845     else
3846     {
3847         gSrcInfo[eWindow].u16DefaultPhase       = pstXC_SetWin_Info->u8DefaultPhase;//compatible for old AP code
3848     }
3849     gSrcInfo[eWindow].bHCusScaling          = pstXC_SetWin_Info->bHCusScaling;
3850     gSrcInfo[eWindow].u16HCusScalingSrc     = pstXC_SetWin_Info->u16HCusScalingSrc;
3851     gSrcInfo[eWindow].u16HCusScalingDst     = pstXC_SetWin_Info->u16HCusScalingDst;
3852     gSrcInfo[eWindow].bVCusScaling          = pstXC_SetWin_Info->bVCusScaling;
3853     gSrcInfo[eWindow].u16VCusScalingSrc     = pstXC_SetWin_Info->u16VCusScalingSrc;
3854     gSrcInfo[eWindow].u16VCusScalingDst     = pstXC_SetWin_Info->u16VCusScalingDst;
3855     gSrcInfo[eWindow].bDisplayNineLattice   = pstXC_SetWin_Info->bDisplayNineLattice;
3856 
3857     return TRUE;
3858 }
3859 
_MDrv_XC_CheckCropWin(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)3860 static void _MDrv_XC_CheckCropWin(void *pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
3861 {
3862     if(pstXC_SetWin_Info == NULL)
3863     {
3864         printf("Invalid Crop Window access\n");
3865         return;
3866     }
3867 
3868     if(pstXC_SetWin_Info->stCropWin.width > pstXC_SetWin_Info->stCapWin.width)
3869     {
3870         pstXC_SetWin_Info->stCropWin.width = pstXC_SetWin_Info->stCapWin.width;
3871     }
3872 
3873     if(pstXC_SetWin_Info->stCropWin.height > pstXC_SetWin_Info->stCapWin.height)
3874     {
3875         pstXC_SetWin_Info->stCropWin.height = pstXC_SetWin_Info->stCapWin.height;
3876     }
3877 
3878     if(pstXC_SetWin_Info->stCropWin.x > (pstXC_SetWin_Info->stCapWin.width - pstXC_SetWin_Info->stCropWin.width))
3879     {
3880         pstXC_SetWin_Info->stCropWin.x = pstXC_SetWin_Info->stCapWin.width - pstXC_SetWin_Info->stCropWin.width;
3881     }
3882     if(pstXC_SetWin_Info->stCropWin.y > (pstXC_SetWin_Info->stCapWin.height - pstXC_SetWin_Info->stCropWin.height))
3883     {
3884         pstXC_SetWin_Info->stCropWin.y = pstXC_SetWin_Info->stCapWin.height - pstXC_SetWin_Info->stCropWin.height;
3885     }
3886 }
3887 
_MDrv_XC_CheckDisplayWin(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)3888 static void _MDrv_XC_CheckDisplayWin(void *pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
3889 {
3890     if(eWindow >= MAX_WINDOW)
3891     {
3892         printf("Invalid window!\n");
3893     }
3894     if(pstXC_SetWin_Info == NULL)
3895     {
3896         printf("Invalid Display Window access\n");
3897         return;
3898     }
3899 
3900     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3901     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3902     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3903     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3904 
3905 #if (XC_SUPPORT_2P_MODE == TRUE)
3906     if (psXCInstPri->u32DeviceID == E_XC_DEVICE1)
3907     {
3908         // sc1 composer sc0 need use 2p in hstart and width
3909         pstXC_SetWin_Info->stDispWin.x = ((pstXC_SetWin_Info->stDispWin.x + 1) & ~0x01);
3910         pstXC_SetWin_Info->stDispWin.width = (pstXC_SetWin_Info->stDispWin.width  & ~0x01);
3911     }
3912 #endif
3913 
3914     if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID && XC_DEVICE1_IS_INTERLACE_OUT)
3915     {
3916         pstXC_SetWin_Info->stDispWin.y /= 2;
3917         pstXC_SetWin_Info->stDispWin.height /= 2;
3918     }
3919 
3920     // TGEN does not allow display window height <= 5 or it cannot decide VDE_End
3921     if (pstXC_SetWin_Info->stDispWin.height <= 5)
3922     {
3923         pstXC_SetWin_Info->stDispWin.height = 5;
3924     }
3925 
3926 
3927     if ((pstXC_SetWin_Info->stDispWin.x
3928            + pstXC_SetWin_Info->stDispWin.width
3929            + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart)
3930          > pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal)
3931     {
3932         pstXC_SetWin_Info->stDispWin.width = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal
3933                                              - pstXC_SetWin_Info->stDispWin.x
3934                                              - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart;
3935         printf("Display Window size is exceeded Htotal, display window horizontal end is limited to Htotal\n");
3936     }
3937 
3938     if ((pstXC_SetWin_Info->stDispWin.y
3939            + pstXC_SetWin_Info->stDispWin.height
3940            + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart)
3941         > pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal)
3942     {
3943         pstXC_SetWin_Info->stDispWin.height = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal
3944                                              - pstXC_SetWin_Info->stDispWin.y
3945                                              - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
3946         printf("Display Window size is exceeded Vtotal, display window vertical end is limited to Vtotal\n");
3947     }
3948 
3949     //patch for monaco,monet 3D SC HW limitation, if input is SBS,PA, CB, capture window's width must be align by 4
3950 #ifndef DISABLE_3D_FUNCTION
3951     if((E_XC_3D_INPUT_SIDE_BY_SIDE_HALF == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW))
3952         || (E_XC_3D_INPUT_PIXEL_ALTERNATIVE == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW))
3953         || (E_XC_3D_INPUT_CHECK_BORAD == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW)))
3954     {
3955         pstXC_SetWin_Info->stCapWin.width &= ~0x03;
3956     }
3957 #endif
3958 
3959     // do OverScan to avoid black border is shown
3960     if ((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN)
3961     {
3962         pstXC_SetWin_Info->stDispWin.x -= pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange/2;
3963         pstXC_SetWin_Info->stDispWin.y -= pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange/2;
3964         pstXC_SetWin_Info->stDispWin.width += pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange;
3965         pstXC_SetWin_Info->stDispWin.height += pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange;
3966     }
3967 
3968 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3969     // FRC 3D enable: SC transforms to TB, FRC transforms to FA/LA, 3D mode is FA/LA in SDK.
3970     if(MHal_FRC_IsEnableFRC3D(pInstance,MAIN_WINDOW))
3971     {
3972         if((MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_TOP_BOTTOM)
3973             &&(pXCResourcePrivate->stdrvXC_3D._bLAToTB))
3974         {
3975             pstXC_SetWin_Info->stDispWin.y /= 2;
3976         }
3977     }
3978 #endif
3979 }
3980 
_MDrv_XC_CheckCaptureWin(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)3981 static void _MDrv_XC_CheckCaptureWin(void *pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
3982 {
3983     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3984     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3985     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3986     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3987 
3988     MS_BOOL bFramePacking = FALSE;
3989     if(pstXC_SetWin_Info == NULL)
3990     {
3991         printf("Invalid Capture Window access\n");
3992         return;
3993     }
3994 
3995 #if (XC_SUPPORT_2P_MODE == TRUE)
3996     // 2p mode need width as even
3997     pstXC_SetWin_Info->stCapWin.width = ((pstXC_SetWin_Info->stCapWin.width + 1) & ~0x01);
3998 #endif
3999 
4000     if(pstXC_SetWin_Info->bInterlace)
4001     {
4002         //The component 1080i can't frame lock when capture start is odd.
4003         {
4004             // the Capture start should be even
4005             if(pstXC_SetWin_Info->stCapWin.y%2)
4006             {
4007                 pstXC_SetWin_Info->stCapWin.y += 1;
4008                 pstXC_SetWin_Info->stCapWin.height -= 1; //Y+1, so height-1 to keep not capture outside
4009             }
4010         }
4011 
4012         // the Capture height should be even
4013         if(pstXC_SetWin_Info->stCapWin.height%2)
4014         {
4015             pstXC_SetWin_Info->stCapWin.height -= 1;
4016         }
4017     }
4018 
4019     //patch for monaco 3D SC HW limitation, if input is SBS, 2D_HW, PA, CB, capture window's width must be align by 4
4020     #if(HW_DESIGN_3D_VER == 5) //monaco mode
4021         if((E_XC_3D_INPUT_SIDE_BY_SIDE_HALF == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW))
4022             || (E_XC_3D_INPUT_PIXEL_ALTERNATIVE == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW))
4023             || (E_XC_3D_INPUT_CHECK_BORAD == MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW)))
4024         {
4025             pstXC_SetWin_Info->stCapWin.width &= ~0x03;
4026         }
4027     #endif
4028 #ifndef DISABLE_3D_FUNCTION
4029     //if input is LA or TB, capture.height must be even.
4030     if((E_XC_3D_INPUT_LINE_ALTERNATIVE == MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow))
4031         || (E_XC_3D_INPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow)))
4032     {
4033         bFramePacking = MDrv_SC_3D_IsFramePaking(pInstance,
4034                                                  pstXC_SetWin_Info->stCapWin.width,
4035                                                  pstXC_SetWin_Info->stCapWin.height,
4036                                                  pstXC_SetWin_Info->bInterlace);
4037         if(!bFramePacking)
4038         {
4039             pstXC_SetWin_Info->stCapWin.height &= ~0x01;
4040         }
4041     }
4042 #endif
4043 #if(HW_DESIGN_4K2K_VER == 7) //Kano Patch
4044     if((E_XC_DEVICE1 == psXCInstPri->u32DeviceID) &&
4045         (IsSrcTypeCapture(gSrcInfo[eWindow].enInputSourceType)))
4046     {
4047         // H2V2 enabled
4048         if(SC_R2BYTEMSK(E_XC_DEVICE0, REG_SC_BK6A_20_L, BIT(0)) == BIT(0))
4049         {
4050             // When Kano H2V2 is enabled, H sync and DE will randomly shift 1 pixel
4051             // Need to switch to DE bypass mode to make sure video is always aligned
4052             // Attention, in DE bypass mode, capture window setting will be useless
4053             //This is SW patch for H2V2SD, U02 does not need
4054             if((H2V2_PIXEL_SHIFT_PATCH_USING_IP_DE_BYPASS_MODE == TRUE) && (MDrv_SYS_GetChipRev() == 0x00))
4055             {
4056                 Hal_SC_ip_set_de_bypass_mode(pInstance, TRUE, eWindow);
4057             }
4058             pstXC_SetWin_Info->stCapWin.x = (pstXC_SetWin_Info->stCapWin.x / 2) - 59; // H_DE has 60 pixels delay
4059             pstXC_SetWin_Info->stCapWin.y /= 2;
4060             pstXC_SetWin_Info->stCapWin.width /= 2;
4061             pstXC_SetWin_Info->stCapWin.height /= 2;
4062         }
4063         // H2V2 bypassed
4064         else
4065         {
4066             //This is SW patch for H2V2SD, U02 does not need
4067             if((H2V2_PIXEL_SHIFT_PATCH_USING_IP_DE_BYPASS_MODE == TRUE) && (MDrv_SYS_GetChipRev() == 0x00))
4068             {
4069                 Hal_SC_ip_set_de_bypass_mode(pInstance, FALSE, eWindow);
4070             }
4071             pstXC_SetWin_Info->stCapWin.x += 11; // H_DE has 11 pixels delay
4072         }
4073     }
4074 #endif
4075 }
4076 
MDrv_XC_Get_VirtualBox_Info(void * pInstance,XC_VBOX_INFO * pstXC_VboxInfo)4077 MS_BOOL MDrv_XC_Get_VirtualBox_Info(void *pInstance,XC_VBOX_INFO *pstXC_VboxInfo)
4078 {
4079     MS_U8 u8FrameCnt = 0;
4080 
4081     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4082     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4083     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4084     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4085 
4086 
4087     if(pstXC_VboxInfo)
4088     {
4089 #ifndef DONT_USE_CMA
4090 #if (XC_SUPPORT_CMA ==TRUE)
4091 #if(HW_DESIGN_4K2K_VER == 7) // Kano
4092         if((psXCInstPri->u32DeviceID == 0))
4093 #endif
4094         {
4095             if ((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM] + gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM]) != 0)
4096                 pstXC_VboxInfo->u32FBSize[0] = (gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM] + gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM]);
4097             else if ((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM] + gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM]) != 0)
4098                 pstXC_VboxInfo->u32FBSize[0] = (gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM] + gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM]);
4099         }
4100 #else
4101         pstXC_VboxInfo->u32FBSize[0] = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size;
4102 #endif
4103 #else
4104         pstXC_VboxInfo->u32FBSize[0] = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size;
4105 #endif
4106         pstXC_VboxInfo->u32FBSize[1] = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size;
4107         pstXC_VboxInfo->u16VBox_PanelHsize = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
4108         pstXC_VboxInfo->u16VBox_PanelVsize = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
4109 
4110         // temp for sub
4111         pstXC_VboxInfo->u16VBox_Htotal[1] = 1920;
4112         pstXC_VboxInfo->u16VBox_Vtotal[1] = 1080;
4113 
4114         if(XC_SUPPORT_4K2K)
4115         {
4116                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_SAVE_MEM_MODE)
4117                 {
4118                     // in 4K2K case, the Madi mode is BK12_02 = 0x300 = 16bit/pixels
4119                     u8FrameCnt = (pstXC_VboxInfo->u32FBSize[0]) / (pstXC_VboxInfo->u16VBox_PanelHsize*pstXC_VboxInfo->u16VBox_PanelVsize * 16/8);
4120                 }
4121                 else
4122                 {
4123                     // in 4K2K case, the Madi mode is P_Mode10 = 20bit/pixels
4124                     u8FrameCnt = (pstXC_VboxInfo->u32FBSize[0]) / (pstXC_VboxInfo->u16VBox_PanelHsize*pstXC_VboxInfo->u16VBox_PanelVsize * 20/8);
4125                 }
4126                 if(u8FrameCnt >= 2)
4127                 {
4128             #if FRC_INSIDE
4129                 /// FRC Enable
4130                     if(pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited)
4131                     {
4132                         #if(HW_DESIGN_4K2K_VER == 6)
4133                             if (pstXC_VboxInfo->bInterface[0] == FALSE)
4134                             {
4135                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4136                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4137                             }
4138                             else
4139                             {
4140                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4141                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4142                             }
4143                         #else
4144                             if(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_4K2K)
4145                             {
4146                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4147                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4148                             }
4149                             else //if(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_2K1K)) and others
4150                             {
4151                                 // 2K2K only for Napoli with FRC_On
4152                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4153                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080*2;
4154                             }
4155                         #endif
4156                     }
4157                     else  /// FRC Disable
4158                     {
4159                         #if(HW_DESIGN_4K2K_VER == 6) || (HW_DESIGN_4K2K_VER == 7)
4160                             if (pstXC_VboxInfo->bInterface[0] == FALSE)
4161                             {
4162                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4163                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4164                             }
4165                             else
4166                             {
4167                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4168                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4169                             }
4170                         #else
4171                             if((pstXC_VboxInfo->u16Vfreq[0] <= 300)&&(pstXC_VboxInfo->bInterface[0] == FALSE))
4172                             {
4173                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;//1920; //3840;
4174                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;//1080; //2160;
4175                             }
4176                             else
4177                             {
4178                                 pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4179                                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4180                             }
4181                         #endif
4182                     }
4183             #else
4184                 if(!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE) && (pstXC_VboxInfo->bInterface[0] == FALSE) )
4185                 {
4186                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4187                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4188                 }
4189                 else if(!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE) && (pstXC_VboxInfo->bInterface[0] == TRUE) )// DI 300MHz
4190                 {
4191                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4192                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4193                 }
4194                 else // exp : Nike, Monaco_legacy_mode
4195                 {
4196                     if((pstXC_VboxInfo->u16Vfreq[0] <= 300)&&(pstXC_VboxInfo->bInterface[0] == FALSE))
4197                     {
4198                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4199                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4200                     }
4201                     else
4202                     {
4203                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4204                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4205                     }
4206                 }
4207         #endif
4208                 }
4209                 else
4210                  {
4211             #if (FRC_INSIDE &&(HW_DESIGN_4K2K_VER != 6))
4212                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited
4213                      &&(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_2K1K))
4214                     {
4215                         // 2K2K only for Napoli with FRC_On
4216                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4217                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080*2;
4218                     }
4219                     else
4220             #endif
4221 
4222             #if(HW_DESIGN_4K2K_VER == 6)
4223                     if(pstXC_VboxInfo->bInterface[0] == FALSE)//p mode//Monet: RFBl/FBL
4224                     {
4225                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
4226                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
4227                     }
4228                     else//i mode
4229                     {
4230                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4231                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4232                     }
4233             #else
4234                     {
4235                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4236                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4237                     }
4238             #endif
4239                  }
4240             }
4241             else
4242             {
4243                 pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
4244                 pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
4245             }
4246         return TRUE;
4247     }
4248     else
4249     {
4250         return FALSE;
4251     }
4252 
4253 }
4254 
MApi_XC_Get_VirtualBox_Info_U2(void * pInstance,XC_VBOX_INFO * pstXC_VboxInfo)4255 E_APIXC_ReturnValue MApi_XC_Get_VirtualBox_Info_U2(void* pInstance, XC_VBOX_INFO *pstXC_VboxInfo)
4256 {
4257     MS_BOOL bRet = FALSE;
4258     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4259     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4260     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
4261 
4262     bRet = MDrv_XC_Get_VirtualBox_Info(pInstance,pstXC_VboxInfo);
4263 
4264     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
4265 
4266     if (bRet)
4267     {
4268         return E_APIXC_RET_OK;
4269     }
4270     else
4271     {
4272         return E_APIXC_RET_FAIL;
4273     }
4274 }
4275 
MApi_XC_Get_VirtualBox_Info(XC_VBOX_INFO * pstXC_VboxInfo)4276 E_APIXC_ReturnValue MApi_XC_Get_VirtualBox_Info(XC_VBOX_INFO *pstXC_VboxInfo)
4277 {
4278     if (pu32XCInst == NULL)
4279     {
4280         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
4281         return E_APIXC_RET_FAIL;
4282     }
4283 
4284     stXC_Get_VBOX_Info XCArgs;
4285     XCArgs.pstXC_VboxInfo = pstXC_VboxInfo;
4286     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
4287 
4288     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_VBOX_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
4289     {
4290         return E_APIXC_RET_FAIL;
4291     }
4292     else
4293     {
4294         return XCArgs.eReturnValue;
4295     }
4296 }
4297 
MDrv_XC_ConfigCMA(void * pInstance,XC_CMA_CONFIG * pstXC_CMA_Config,XC_CMA_CLIENT enCmaClient,MS_U32 u32DataLen,SCALER_WIN eWindow)4298 MS_BOOL MDrv_XC_ConfigCMA(void *pInstance, XC_CMA_CONFIG *pstXC_CMA_Config, XC_CMA_CLIENT enCmaClient, MS_U32 u32DataLen, SCALER_WIN eWindow)
4299 {
4300 #ifndef DONT_USE_CMA
4301 #if (XC_SUPPORT_CMA ==TRUE)
4302     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4303     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4304     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4305     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4306 #if(HW_DESIGN_4K2K_VER == 7) // Kano
4307     if(psXCInstPri->u32DeviceID != 0)
4308     {
4309         return TRUE;
4310     }
4311 #endif
4312     if (enCmaClient >= CMA_XC_MEM_NUM)
4313     {
4314         printf("[%s,%5d] XC CMA CMA Client error!\n",__FUNCTION__,__LINE__);
4315         return FALSE;
4316     }
4317 
4318     if (u32DataLen == sizeof(XC_CMA_CONFIG))
4319     {
4320         memcpy(&gSrcInfo[eWindow].Status2.stXCConfigCMA[enCmaClient], pstXC_CMA_Config, u32DataLen);
4321     }
4322     else
4323     {
4324         printf("[%s,%5d] XC CMA u32DataLen error!\n",__FUNCTION__,__LINE__);
4325         return FALSE;
4326     }
4327 #endif
4328 #endif
4329     return TRUE;
4330 }
4331 
MApi_XC_ConfigCMA_U2(void * pInstance,XC_CMA_CONFIG * pstXC_CMA_Config,XC_CMA_CLIENT enCmaClient,MS_U32 u32DataLen,SCALER_WIN eWindow)4332 MS_BOOL MApi_XC_ConfigCMA_U2(void *pInstance, XC_CMA_CONFIG *pstXC_CMA_Config, XC_CMA_CLIENT enCmaClient, MS_U32 u32DataLen, SCALER_WIN eWindow)
4333 {
4334     MS_BOOL bRet = FALSE;
4335     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
4336 
4337     bRet = MDrv_XC_ConfigCMA(pInstance, pstXC_CMA_Config, enCmaClient, u32DataLen, eWindow);
4338 
4339     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
4340 
4341     return bRet;
4342 }
4343 
MApi_XC_ConfigCMA(XC_CMA_CONFIG * pstXC_CMA_Config,XC_CMA_CLIENT enCmaClient,MS_U32 u32DataLen,SCALER_WIN eWindow)4344 MS_BOOL MApi_XC_ConfigCMA(XC_CMA_CONFIG *pstXC_CMA_Config, XC_CMA_CLIENT enCmaClient, MS_U32 u32DataLen, SCALER_WIN eWindow)
4345 {
4346     if (pu32XCInst == NULL)
4347     {
4348         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
4349         {
4350             printf("UtopiaOpen XC failed\n");
4351             return FALSE;
4352         }
4353     }
4354 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
4355      if (pu32XCInst_1 == NULL)
4356      {
4357         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
4358         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
4359 
4360         stXCInstantAttribute.u32DeviceID = 1;
4361         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
4362         {
4363             printf("UtopiaOpen XC failed\n");
4364             return FALSE;
4365         }
4366       }
4367 #endif
4368 
4369     stXC_CONFIG_CMA XCArgs;
4370     XCArgs.pstXC_CMA_Config = pstXC_CMA_Config;
4371     XCArgs.enCmaClient = enCmaClient;
4372     XCArgs.u32InitDataLen = u32DataLen;
4373     XCArgs.eWindow = eWindow;
4374 
4375     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CONFIG_CMA, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
4376     {
4377         printf("Obtain XC engine fail\n");
4378         return FALSE;
4379     }
4380     else
4381     {
4382         return TRUE;
4383     }
4384 }
4385 #if (defined (ANDROID)&& defined(UFO_XC_DS_PQ))
4386 extern void MDrv_PQ_set_imode_PQDS(MS_BOOL imode);
4387 #endif
4388 //-------------------------------------------------------------------------------------------------
4389 /// Set the specific window
4390 /// @param  pstXC_SetWin_Info      \b IN: the information of the window setting
4391 /// @param  u32InitDataLen         \b IN: the length of the pstXC_SetWin_Info
4392 /// @param  eWindow                \b IN: which window we are going to set
4393 /// @return @ref MS_BOOL
4394 //-------------------------------------------------------------------------------------------------
_MApi_XC_SetWindow(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,MS_U32 u32InitDataLen,MS_BOOL bDualWindow,SCALER_WIN eWindow)4395 static MS_BOOL _MApi_XC_SetWindow(void *pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, MS_U32 u32InitDataLen, MS_BOOL bDualWindow, SCALER_WIN eWindow)
4396 {
4397 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
4398 u32SetWindowTime = MsOS_GetSystemTime();
4399 #endif
4400 #ifdef VIDEO_4K_I_PATCH
4401     if((pstXC_SetWin_Info->stCapWin.height > VIDEO_4K_I_BIG_HEIGHT)&&(pstXC_SetWin_Info->bInterlace))
4402     {
4403         pstXC_SetWin_Info->stCapWin.height -= 4;
4404     }
4405 #endif
4406 
4407 #if VERIFY_MVIDEO_FPGA
4408     MS_BOOL binterlace =FALSE;
4409 #endif
4410 //    MS_BOOL bEnableHighSpeedFclk = FALSE;
4411     MS_U32 u32DisPOddCheck = 0x00;
4412     MS_BOOL bRet = TRUE;
4413 
4414     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
4415     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4416     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4417     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4418     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
4419     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4420 
4421 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4422     MS_BOOL bChangeDisplaySize = FALSE;
4423     MS_U8 u8LPLL_Type =(MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
4424 #endif
4425 
4426     // Need clear dual mode enable
4427 #ifdef UFO_XC_SUPPORT_DUAL_MIU
4428     //MDrv_XC_EnableMiuDualMode(pInstance, FALSE, 2, 2, eWindow);
4429 #endif
4430 #if 0 //jsut for test for maserati dual miu.
4431 #ifndef DONT_USE_CMA
4432 #ifdef UFO_XC_SUPPORT_DUAL_MIU
4433         if (eWindow == MAIN_WINDOW)
4434         {
4435             if (IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType)) //&& ((pstXC_SetWin_Info->stCapWin.width > 1920) && (pstXC_SetWin_Info->stCapWin.height > 1080)))
4436             {
4437                 MDrv_XC_EnableMiuDualMode(pInstance, TRUE, 2, 2, MAIN_WINDOW);
4438             }
4439             else
4440             {
4441                 MDrv_XC_EnableMiuDualMode(pInstance, FALSE, 2, 2, eWindow);
4442             }
4443         }
4444         else
4445         {
4446             MDrv_XC_EnableMiuDualMode(pInstance, FALSE, 2, 2, eWindow);
4447         }
4448 #endif
4449 #endif
4450 #endif
4451 
4452 
4453     MDrv_SC_SetPQHSDFlag(pInstance, FALSE); //Reset variable
4454 
4455 
4456 #ifdef K3_U2
4457     // Prepare seamless zapping, reset commands in next DS index
4458     if((Hal_SC_GetSeamlessZappingStatus(pInstance, eWindow)) && (Hal_SC_get_freezeimg(pInstance, eWindow)))
4459     {
4460         Hal_SC_PrepareSeamlessZapping(pInstance, eWindow);
4461     }
4462 #endif
4463 #ifdef UFO_XC_HDMI_4K2K_DMA
4464     if(IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType) && (pstXC_SetWin_Info->stCapWin.width >= 3840) && (pstXC_SetWin_Info->stCapWin.height >= 2160))
4465     {
4466         MHal_XC_HDR_Control(pInstance, E_XC_HDR_CTRL_INIT_DMA_HDMI, (void *)(&pXCResourcePrivate->stdrvXC_Display._stDMAInitInfo_Hdmi));
4467     }
4468     else
4469     {
4470         MHal_XC_HDR_Control(pInstance, E_XC_HDR_CTRL_INIT_DMA, (void *)(&pXCResourcePrivate->stdrvXC_Display._stDMAInitInfo));
4471     }
4472 #endif
4473 #ifdef VDEC_4K2K_PATCH_MODIFY_INFO
4474     if(IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType)||IsSrcTypeDTV(gSrcInfo[eWindow].enInputSourceType))
4475     {
4476         if( pstXC_SetWin_Info->stCapWin.width>=2048 )
4477         {
4478             pstXC_SetWin_Info->stCapWin.width=pstXC_SetWin_Info->stCapWin.width /2;
4479             pstXC_SetWin_Info->stCapWin.x=pstXC_SetWin_Info->stCapWin.x /2;
4480         }
4481 
4482         if( pstXC_SetWin_Info->stCropWin.width>=2048 )
4483         {
4484             pstXC_SetWin_Info->stCropWin.width=pstXC_SetWin_Info->stCropWin.width /2;
4485             pstXC_SetWin_Info->stCropWin.x=pstXC_SetWin_Info->stCropWin.x /2;
4486         }
4487     }
4488 #endif
4489 
4490 #ifdef VIDEO_4K_I_PATCH
4491     if((pstXC_SetWin_Info->stCropWin.height > VIDEO_4K_I_HEIGHT)&&(pstXC_SetWin_Info->bInterlace == TRUE))
4492     {
4493          pstXC_SetWin_Info->stCropWin.height /= 2;
4494     }
4495 #endif
4496 
4497     // we've to support interface changed without re-compile user application
4498     // please specify new added interface default value here
4499     //_u16XCDbgSwitch_InternalUseOnly = (XC_DBGLEVEL_SETWINDOW|XC_DGBLEVEL_CROPCALC|XC_DBGLEVEL_SETTIMING);
4500     if(u32InitDataLen != sizeof(XC_SETWIN_INFO))
4501     {
4502         // customer application different version with our driver
4503         // start from customized pre H/V scaling
4504         gSrcInfo[eWindow].Status2.bPreHCusScaling = FALSE;
4505         gSrcInfo[eWindow].Status2.bPreVCusScaling = FALSE;
4506         gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc = 0;
4507         gSrcInfo[eWindow].Status2.u16PreHCusScalingDst = 0;
4508         gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc = 0;
4509         gSrcInfo[eWindow].Status2.u16PreVCusScalingDst = 0;
4510     }
4511     else
4512     {
4513         gSrcInfo[eWindow].Status2.bPreHCusScaling = pstXC_SetWin_Info->bPreHCusScaling;
4514         gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc = pstXC_SetWin_Info->u16PreHCusScalingSrc;
4515         gSrcInfo[eWindow].Status2.u16PreHCusScalingDst = pstXC_SetWin_Info->u16PreHCusScalingDst;
4516 
4517         if(gSrcInfo[eWindow].Status2.u16PreHCusScalingDst > gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc)
4518         {
4519             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"H can't do pre scaling up, change to auto prescaling\n");
4520             gSrcInfo[eWindow].Status2.bPreHCusScaling = FALSE;
4521             gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc = 0;
4522             gSrcInfo[eWindow].Status2.u16PreHCusScalingDst = 0;
4523         }
4524 
4525         if (gSrcInfo[eWindow].Status2.bPreHCusScaling)
4526         {
4527             if (gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc == 0 || gSrcInfo[eWindow].Status2.u16PreHCusScalingDst == 0)
4528             {
4529                 gSrcInfo[eWindow].Status2.bPreHCusScaling = FALSE;
4530                 gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc = 0;
4531                 gSrcInfo[eWindow].Status2.u16PreHCusScalingDst = 0;
4532                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"PreHCus Src or Dst can not be 0 \n");
4533                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
4534                 return FALSE;
4535             }
4536         }
4537         else
4538         {
4539             gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc = 0;
4540             gSrcInfo[eWindow].Status2.u16PreHCusScalingDst = 0;
4541         }
4542 
4543         gSrcInfo[eWindow].Status2.bPreVCusScaling = pstXC_SetWin_Info->bPreVCusScaling;
4544         gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc = pstXC_SetWin_Info->u16PreVCusScalingSrc;
4545         gSrcInfo[eWindow].Status2.u16PreVCusScalingDst = pstXC_SetWin_Info->u16PreVCusScalingDst;
4546 
4547         if(gSrcInfo[eWindow].Status2.u16PreVCusScalingDst > gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc)
4548         {
4549             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"V can't do pre scaling up, change to auto prescaling\n");
4550             gSrcInfo[eWindow].Status2.bPreVCusScaling = FALSE;
4551             gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc = 0;
4552             gSrcInfo[eWindow].Status2.u16PreVCusScalingDst = 0;
4553         }
4554 
4555         if (gSrcInfo[eWindow].Status2.bPreVCusScaling)
4556         {
4557             if (gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc == 0 || gSrcInfo[eWindow].Status2.u16PreVCusScalingDst == 0  )
4558             {
4559                 gSrcInfo[eWindow].Status2.bPreVCusScaling = FALSE;
4560                 gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc = 0;
4561                 gSrcInfo[eWindow].Status2.u16PreVCusScalingDst = 0;
4562                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"PreVCus Src or Dst can not be 0 \n");
4563                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
4564                 return FALSE;
4565             }
4566         }
4567         else
4568         {
4569             gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc = 0;
4570             gSrcInfo[eWindow].Status2.u16PreVCusScalingDst = 0;
4571         }
4572     }
4573 
4574     _MDrv_XC_CheckCaptureWin(pInstance, pstXC_SetWin_Info, eWindow);
4575     _MDrv_XC_CheckCropWin(pInstance, pstXC_SetWin_Info, eWindow);
4576     _MDrv_XC_CheckDisplayWin(pInstance, pstXC_SetWin_Info, eWindow);
4577 
4578     #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4579     if (IsVBY1_16LANE(u8LPLL_Type))
4580     {
4581         // For 120Hz BW request, need to send video size to FRC,
4582         // FRC would reduce BW by different case
4583 #if (defined (ANDROID))
4584 #else
4585         Hal_XC_FRC_R2_Set_InputFrameSize(pInstance, pstXC_SetWin_Info->stCropWin.width, pstXC_SetWin_Info->stCropWin.height);
4586 #endif
4587     }
4588     #endif
4589 
4590     // copy user data to internal data
4591     // here is a patch first, will remove after seperate Internal XC status with set window information
4592     //u32CopyLen = sizeof(XC_SETWIN_INFO) - (sizeof(MS_BOOL)*2) - (sizeof(MS_U16)*4);
4593     //memcpy(&gSrcInfo[eWindow], pstXC_SetWin_Info, u32CopyLen);
4594     //do not use memcopy(), strongly depend on structure definition
4595     _Mdrv_XC_CopySetWinInfo(pInstance, pstXC_SetWin_Info, eWindow);
4596 #ifndef DISABLE_3D_FUNCTION
4597     bRet = MDrv_SC_3D_FormatValidation(pInstance, &gSrcInfo[eWindow], eWindow);
4598 #endif
4599 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4600         if ((pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] != E_XC_3D_INPUT_MODE_NONE)
4601             && (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode != E_XC_3D_OUTPUT_MODE_NONE)
4602            )
4603         {
4604             MHal_XC_PixelShiftStatusChange(pInstance, EN_XC_PIXEL_SHIFT_DISABLE);
4605         }
4606 #endif
4607 
4608 #ifndef DISABLE_3D_FUNCTION
4609 
4610     //for 3D handle invalid display window
4611     if(E_XC_3D_OUTPUT_CHECKBOARD_HW == MDrv_XC_Get_3D_Output_Mode(pInstance))
4612     {
4613         gSrcInfo[eWindow].stDispWin.y &= ~0x1;
4614         gSrcInfo[eWindow].stDispWin.x &= ~0x1;
4615         gSrcInfo[eWindow].stDispWin.height &= ~0x1;
4616         gSrcInfo[eWindow].stDispWin.width &= ~0x1;
4617     }
4618     else if((E_XC_3D_OUTPUT_LINE_ALTERNATIVE == MDrv_XC_Get_3D_Output_Mode(pInstance))
4619             || (E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW == MDrv_XC_Get_3D_Output_Mode(pInstance))
4620             || ((E_XC_3D_OUTPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Output_Mode(pInstance)) && MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)))
4621     {
4622         gSrcInfo[eWindow].stDispWin.y &= ~0x1;
4623         gSrcInfo[eWindow].stDispWin.height &= ~0x1;
4624     }
4625     else if(E_XC_3D_OUTPUT_PIXEL_ALTERNATIVE_HW == MDrv_XC_Get_3D_Output_Mode(pInstance))
4626     {
4627         gSrcInfo[eWindow].stDispWin.x &= ~0x1;
4628         gSrcInfo[eWindow].stDispWin.width &= ~0x1;
4629     }
4630     else if((E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF == MDrv_XC_Get_3D_Output_Mode(pInstance))
4631             || (E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW == MDrv_XC_Get_3D_Output_Mode(pInstance)))
4632     {
4633         gSrcInfo[eWindow].stDispWin.width &= ~0x1;
4634     }
4635     else if((E_XC_3D_OUTPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Output_Mode(pInstance))
4636             || (E_XC_3D_OUTPUT_TOP_BOTTOM_HW == MDrv_XC_Get_3D_Output_Mode(pInstance)))
4637     {
4638         gSrcInfo[eWindow].stDispWin.height &= ~0x1;
4639     }
4640 #endif
4641 
4642     // assert check
4643     MS_ASSERT((gSrcInfo[eWindow].bHCusScaling==TRUE)?((gSrcInfo[eWindow].u16HCusScalingSrc!=0)&&(gSrcInfo[eWindow].u16HCusScalingDst!=0)):1);
4644     MS_ASSERT((gSrcInfo[eWindow].bVCusScaling==TRUE)?((gSrcInfo[eWindow].u16VCusScalingSrc!=0)&&(gSrcInfo[eWindow].u16VCusScalingDst!=0)):1);
4645     MS_ASSERT((gSrcInfo[eWindow].Status2.bPreHCusScaling==TRUE)?((gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc!=0)&&(gSrcInfo[eWindow].Status2.u16PreHCusScalingDst!=0)):1);
4646     MS_ASSERT((gSrcInfo[eWindow].Status2.bPreVCusScaling==TRUE)?((gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc!=0)&&(gSrcInfo[eWindow].Status2.u16PreVCusScalingDst!=0)):1);
4647 
4648     // The total pixel conut of display window can not be odd.
4649     u32DisPOddCheck = gSrcInfo[eWindow].stDispWin.width * gSrcInfo[eWindow].stDispWin.height;
4650     // if u32DisPOddCheck is odd, that means both of disp.width and disp.height is odd.
4651     // we adjust width to even.
4652     if (u32DisPOddCheck & 0x01)
4653     {
4654         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > gSrcInfo[eWindow].stDispWin.width )
4655         {
4656             gSrcInfo[eWindow].stDispWin.width = ( gSrcInfo[eWindow].stDispWin.width + 1 ) & ~0x1;
4657         }
4658     }
4659 
4660     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K_HALFK_240HZ)
4661     {
4662         gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height/4;
4663     }
4664     else if(MDrv_XC_Is2K2KToFrc(pInstance))
4665     {
4666         gSrcInfo[eWindow].stDispWin.x = gSrcInfo[eWindow].stDispWin.x/2;
4667         gSrcInfo[eWindow].stDispWin.width = gSrcInfo[eWindow].stDispWin.width/2;
4668     }
4669 
4670     #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4671     // For Manhattan, FSC+FRC
4672     // Only main path support FSC+FSC, so not change FSC/FRC status for sub setwindow
4673     if (eWindow == MAIN_WINDOW)
4674     {
4675         if (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_MODE_NONE)
4676         {
4677             // Maserati mode
4678             if (IsVBY1_16LANE(u8LPLL_Type))
4679             {
4680                 if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_SKIP_SR)
4681                 {
4682                     // case 4: no FSC + FRC
4683                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = TRUE; // Maserati mode, FRC always need
4684                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
4685                 }
4686                 else
4687                 {
4688                     // case 5: FSC + FRC
4689                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = TRUE; // Maserati mode, FRC always need
4690                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = TRUE;
4691                 }
4692             }
4693             else // Manhattan mode
4694             if ((MHal_FRC_IsSupportFRC_byEfuse(pInstance))
4695                &&(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE))
4696                && (MHal_FRC_Check_Condition(pInstance))
4697                &&!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_SKIP_SR)
4698                 )
4699             {
4700                 // MM 24/25/30fps case, need MEMC, so use case3
4701                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = TRUE;
4702                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = TRUE;
4703             }
4704             else if (!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_SKIP_SR))
4705             {
4706                 // SD/FHD input case, always do SR, so use case2
4707                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
4708                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = TRUE;
4709             }
4710             else
4711             {
4712                 // 4K 50/60 case, no need to do SR and MEMC, so use case1
4713                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
4714                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
4715             }
4716         }
4717         else
4718         {
4719             ///3D Maserati mode or manhattan mode use FRC 3D
4720             if ((MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW)
4721 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
4722                 || Hal_SC_3D_IsDualViewMode(pInstance,eWindow)
4723 #endif
4724                 //Frc cant do memc under RGB source.Memc will bypass if RGB source in.
4725                 //Under memc bypass mode it cant send 3D LR flag so that RGB 3D should disable FRC enable flag.
4726                 ) && gSrcInfo[MAIN_WINDOW].bUseYUVSpace
4727                 && (!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_SKIP_SR)))
4728             {
4729                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = TRUE;
4730                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = TRUE;
4731             }
4732             else if (!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_SKIP_SR))
4733             {
4734                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
4735                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = TRUE;
4736             }
4737             else
4738             {
4739                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
4740                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
4741             }
4742         }
4743 
4744         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
4745         {
4746             if (MHal_FRC_IsFHDToFSC(pInstance, eWindow))
4747             {
4748                 // FHD to FSC case, need to make post-scaling to displayH/2 + displayV/2 first
4749                 gSrcInfo[eWindow].stDispWin.x = gSrcInfo[eWindow].stDispWin.x/2;
4750                 gSrcInfo[eWindow].stDispWin.width = gSrcInfo[eWindow].stDispWin.width/2;
4751                 gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y/2;
4752                 gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height/2;
4753                 bChangeDisplaySize = TRUE;
4754 
4755                 // for custom scaling case
4756                 if(gSrcInfo[eWindow].bHCusScaling)
4757                 {
4758                     gSrcInfo[eWindow].u16HCusScalingDst = gSrcInfo[eWindow].u16HCusScalingDst/2;
4759                 }
4760                 if(gSrcInfo[eWindow].bVCusScaling)
4761                 {
4762                     gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst/2;
4763                 }
4764             }
4765         }
4766     }
4767     #endif
4768 
4769     // if mirror, need to re-cal display window but Ninelattice!!
4770     if(IsVMirrorMode(eWindow) &&(!gSrcInfo[eWindow].bDisplayNineLattice))
4771     {
4772         MS_U32 u32TempWidth = gSrcInfo[eWindow].stDispWin.width;
4773         MS_U32 u32TempHeight = gSrcInfo[eWindow].stDispWin.height;
4774 #ifndef DISABLE_3D_FUNCTION
4775 
4776         if(((MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
4777                || (MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW))
4778             && (MDrv_XC_Get_3D_HW_Version() >= 1))
4779         {
4780             gSrcInfo[eWindow].stDispWin.x = gSrcInfo[eWindow].stDispWin.x * 2;
4781         }
4782         else if(((MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM)
4783                     || (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM_HW))
4784                 && ((MDrv_XC_Get_3D_HW_Version() > 1)
4785                     || ((MDrv_XC_Get_3D_HW_Version() == 1) && (!MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)))))
4786         {
4787             gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y * 2;
4788         }
4789 
4790         //for ver3d =1, display window will be half when pass into driver,so here need double it
4791         if(((MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
4792                 || (MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW))
4793             && (MDrv_XC_Get_3D_HW_Version() == 1))
4794         {
4795             u32TempWidth *= 2;
4796         }
4797 #endif
4798 
4799         #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4800         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && bChangeDisplaySize)
4801         {
4802             if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2 > ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth ) )
4803             {
4804                 gSrcInfo[eWindow].stDispWin.x =
4805                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2 - ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth );
4806             }
4807             else
4808             {
4809                 //pixshift case will do overscan,changed display.x&width,x + width >stPanelInfo.u16Width,so need not error handling
4810                 if( !((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN))
4811                 {
4812                     gSrcInfo[eWindow].stDispWin.x = 0;
4813                 }
4814             }
4815         }
4816         else
4817         #endif
4818         if(MDrv_XC_Is2K2KToFrc(pInstance))
4819         {
4820             if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2 > ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth ) )
4821             {
4822                 gSrcInfo[eWindow].stDispWin.x =
4823                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2 - ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth );
4824             }
4825             else
4826             {
4827                 //pixshift case will do overscan,changed display.x&width,x + width >stPanelInfo.u16Width,so need not error handling
4828                 if( !((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN))
4829                 {
4830                     gSrcInfo[eWindow].stDispWin.x = 0;
4831                 }
4832             }
4833         }
4834         else
4835         {
4836             if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth ) )
4837             {
4838                 gSrcInfo[eWindow].stDispWin.x =
4839                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth );
4840             }
4841             else
4842             {
4843                 //pixshift case will do overscan,changed display.x&width,x + width >stPanelInfo.u16Width,so need not error handling
4844                 if( !((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN))
4845                 {
4846                     gSrcInfo[eWindow].stDispWin.x = 0;
4847                 }
4848             }
4849         }
4850 #ifndef DISABLE_3D_FUNCTION
4851 
4852         //for ver3d =1, display window will be half when pass into driver,so here need double it
4853         if(((MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_TOP_BOTTOM)
4854                 || (MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_TOP_BOTTOM_HW))
4855             && (MDrv_XC_Get_3D_HW_Version() == 1))
4856         {
4857             u32TempHeight *= 2;
4858         }
4859 #endif
4860 
4861         #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
4862         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && bChangeDisplaySize)
4863         {
4864             if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 > ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight ) )
4865             {
4866                 gSrcInfo[eWindow].stDispWin.y =
4867                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 - ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight );
4868             }
4869             else
4870             {
4871                 //pixshift case will do overscan,changed display.y&Height,y + Height >stPanelInfo.u16Height,so need not error handling
4872                 if( !((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN))
4873                 {
4874                     gSrcInfo[eWindow].stDispWin.y = 0;
4875                 }
4876             }
4877         }
4878         else
4879         #endif
4880         if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight ) )
4881         {
4882             gSrcInfo[eWindow].stDispWin.y =
4883                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight );
4884         }
4885         else
4886         {
4887             //pixshift case will do overscan,changed display.y&Height,y + Height >stPanelInfo.u16Height,so need not error handling
4888             if( !((pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature & PIXEL_SHIFT_DO_OVERSCAN )== PIXEL_SHIFT_DO_OVERSCAN))
4889             {
4890                 gSrcInfo[eWindow].stDispWin.y = 0;
4891             }
4892         }
4893 #ifndef DISABLE_3D_FUNCTION
4894         if(((MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
4895                 || (MDrv_XC_Get_3D_Output_Mode(pInstance)== E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW))
4896             &&(MDrv_XC_Get_3D_HW_Version() >= 1))
4897         {
4898             gSrcInfo[eWindow].stDispWin.x /= 2;
4899 
4900             //adjust main/sub display window position for ver1
4901             //for ver>=2, this logic is at MDrv_XC_3D_LoadReg
4902             if(MDrv_XC_Get_3D_HW_Version() == 1)
4903             {
4904                 if(eWindow == MAIN_WINDOW)
4905                 {
4906                     gSrcInfo[eWindow].stDispWin.x += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2;
4907                 }
4908                 else
4909                 {
4910                     if(gSrcInfo[eWindow].stDispWin.x >= pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2)
4911                     {
4912                         gSrcInfo[eWindow].stDispWin.x -= pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width / 2;
4913                     }
4914                 }
4915             }
4916         }
4917         else if(((MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM)
4918                     || (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM_HW))
4919                 && ((MDrv_XC_Get_3D_HW_Version() > 1)
4920                     || ((MDrv_XC_Get_3D_HW_Version() == 1) && (!MDrv_SC_3D_Is_LR_Sbs2Line(pInstance)))))
4921         {
4922             gSrcInfo[eWindow].stDispWin.y /= 2;
4923 
4924             //adjust main/sub display window position
4925             //for ver>=2, this logic is at MDrv_XC_3D_LoadReg
4926             if(MDrv_XC_Get_3D_HW_Version() == 1)
4927             {
4928                 if(eWindow == MAIN_WINDOW)
4929                 {
4930                     gSrcInfo[eWindow].stDispWin.y += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height / 2;
4931                 }
4932                 else
4933                 {
4934                     if(gSrcInfo[eWindow].stDispWin.y >= pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height / 2)
4935                     {
4936                         gSrcInfo[eWindow].stDispWin.y -= pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height / 2;
4937                     }
4938                 }
4939             }
4940         }
4941     #endif
4942     }
4943 #ifndef DISABLE_3D_FUNCTION
4944     MDrv_SC_3D_AdjustHShift(pInstance, &gSrcInfo[eWindow], eWindow);
4945 #endif
4946 
4947 if(MDrv_XC_Is_SupportSWDS(pInstance))
4948 {
4949     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[DS] MDrv_XC_GetDynamicScalingStatus():%d MDrv_XC_Is_DSForceIndexEnabled():%d\n",MDrv_XC_GetDynamicScalingStatus(pInstance),MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow));
4950 
4951     if(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow) )
4952     {
4953         gSrcInfo[eWindow].stCapWin.width = pstXC_SetWin_Info->stCapWin.width;
4954         gSrcInfo[eWindow].stCapWin.height = pstXC_SetWin_Info->stCapWin.height;
4955         gSrcInfo[eWindow].stCropWin.width = pstXC_SetWin_Info->stCropWin.width;
4956         gSrcInfo[eWindow].stCropWin.height = pstXC_SetWin_Info->stCropWin.height;
4957     }
4958 }
4959 
4960     gSrcInfo[eWindow].stDispWin.x += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart;
4961     gSrcInfo[eWindow].stDispWin.y += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
4962 
4963     //reset pixel shift preH and preV data
4964     pXCResourcePrivate->stdrvXC_MVideo.s8HPixelShift = 0;
4965     pXCResourcePrivate->stdrvXC_MVideo.s8VPixelShift = 0;
4966 
4967     // dump debug msg
4968     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= SetWindow Start (Window : %u, src: %u) =============\n",eWindow, gSrcInfo[eWindow].enInputSourceType);
4969     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CapWin  x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCapWin.x, gSrcInfo[eWindow].stCapWin.y, gSrcInfo[eWindow].stCapWin.width, gSrcInfo[eWindow].stCapWin.height);
4970     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CropWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCropWin.x, gSrcInfo[eWindow].stCropWin.y, gSrcInfo[eWindow].stCropWin.width, gSrcInfo[eWindow].stCropWin.height);
4971     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stDispWin.x,gSrcInfo[eWindow].stDispWin.y, gSrcInfo[eWindow].stDispWin.width, gSrcInfo[eWindow].stDispWin.height);
4972     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Panel   x: %4u  y: %4u  w: %4u  h: %4u \n",
4973                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart,
4974                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart,
4975                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width,
4976                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
4977     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Mirror/Interlace/Hdup = %u/%u/%u\n", IsVMirrorMode(eWindow), pstXC_SetWin_Info->bInterlace, pstXC_SetWin_Info->bHDuplicate);
4978     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"H/V total = (%u, %u), VFreq = %u\n", pstXC_SetWin_Info->u16DefaultHtotal, pstXC_SetWin_Info->u16InputVTotal, pstXC_SetWin_Info->u16InputVFreq);
4979     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Pre  H cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].Status2.bPreHCusScaling, gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc, gSrcInfo[eWindow].Status2.u16PreHCusScalingDst);
4980     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Pre  V cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].Status2.bPreVCusScaling, gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc, gSrcInfo[eWindow].Status2.u16PreVCusScalingDst);
4981     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Post H cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].bHCusScaling, gSrcInfo[eWindow].u16HCusScalingSrc, gSrcInfo[eWindow].u16HCusScalingDst);
4982     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Post V cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].bVCusScaling, gSrcInfo[eWindow].u16VCusScalingSrc, gSrcInfo[eWindow].u16VCusScalingDst);
4983 
4984 #if VERIFY_MVIDEO_FPGA  //non-de-interlace function
4985     if(gSrcInfo[eWindow].bInterlace)
4986     {
4987         gSrcInfo[eWindow].bInterlace = 0;
4988         binterlace =TRUE;//gSrcInfo[eWindow].u16V_DisSize /= 2;
4989     }
4990 #endif
4991 
4992 #ifdef XC_SUPPORT_2STEP_SCALING
4993     #ifdef UFO_XC_SUPPORT_2STEP_SCALING
4994     MDrv_XC_SetIsSupport2StepScalingFlag(FALSE);
4995     if(MDrv_ReadByte(REG_CHIP_REVISION) >= 1)//Monet U02 fix .
4996     {
4997         if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal > 3000)          // 4K output
4998          &&(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal > 2000)
4999          &&(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_MODE_NONE)          //3D can not enable 2-step scaling. Hardware limitation
5000          &&(MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_MODE_NONE))
5001         {
5002             if( (gSrcInfo[eWindow].stCapWin.width < 1440)
5003                 && (gSrcInfo[eWindow].stDispWin.width == pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width)
5004                 )
5005             {
5006                 MDrv_XC_SetIsSupport2StepScalingFlag(TRUE);
5007             }
5008             else
5009             {
5010                 MDrv_XC_SetIsSupport2StepScalingFlag(FALSE);
5011             }
5012         }
5013     }
5014     #endif
5015 #endif
5016 
5017 
5018     gSrcInfo[eWindow].Status2.u16VirtualBox_Width = 0;
5019     gSrcInfo[eWindow].Status2.u16VirtualBox_Height = 0;
5020 
5021     XC_VBOX_INFO pstXCVBox;
5022     memset(&pstXCVBox, 0, sizeof(XC_VBOX_INFO));
5023     pstXCVBox.bInterface[eWindow] = gSrcInfo[eWindow].bInterlace;
5024     pstXCVBox.u16Vfreq[eWindow] = pstXC_SetWin_Info->u16InputVFreq;
5025 
5026     gSrcInfo[eWindow].u16InputVFreq = pstXC_SetWin_Info->u16InputVFreq;
5027 
5028 #ifndef DONT_USE_CMA
5029 #if (XC_SUPPORT_CMA ==TRUE)
5030     if (
5031 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5032 #ifdef UFO_XC_SUPPORT_SUB_CMA
5033     ((psXCInstPri->u32DeviceID==0)||(psXCInstPri->u32DeviceID==1))
5034 #else
5035     (psXCInstPri->u32DeviceID==0)
5036 #endif
5037 #elif (HW_DESIGN_4K2K_VER == 7)
5038     (psXCInstPri->u32DeviceID == 0) && (MAIN_WINDOW==eWindow)
5039 #else
5040     (MAIN_WINDOW==eWindow)
5041 #endif
5042     && (! MDrv_XC_Is_SupportSWDS(pInstance))
5043     && (pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].isEnable == FALSE))
5044     {
5045         MS_BOOL bIsGetCMA[CMA_XC_MEM_NUM] = {FALSE, };
5046         MS_U32 au32CMAMemSCMSize[CMA_XC_MEM_NUM] = {0, };
5047         MS_U32 au32CMAMemFRCMSize[CMA_XC_MEM_NUM] = {0, };
5048         MS_U32 u32DualMiuMemSize = 0;
5049 
5050         if (MDrv_XC_IsInputSourceDisabled(pInstance, MAIN_WINDOW) == TRUE)
5051         {
5052             MHal_XC_CMAPatchClose(pInstance, MAIN_WINDOW);
5053             bNeedDeattachCMAISR = TRUE;
5054         }
5055         else
5056         {
5057             MHal_XC_CMAPatch(pInstance, MAIN_WINDOW);
5058         }
5059 
5060         #ifdef CONFIG_MSTAR_SRAMPD
5061         // control SRAM PD here
5062         if (MHal_XC_Is_SRAM_PowerDown(pInstance) == TRUE)
5063         {
5064             // enable SRAM here
5065             MHal_XC_SRAM_PowerDown_Control(pInstance, FALSE);
5066         }
5067         #endif
5068 
5069         MHal_XC_Get_CMA_UsingCondition(pInstance, bIsGetCMA, au32CMAMemSCMSize, au32CMAMemFRCMSize, &u32DualMiuMemSize, CMA_XC_MEM_NUM, eWindow);
5070         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], bIsGetCMA[self]=%d bIsGetCMA[cobuff]=%d \n",__func__,__LINE__,bIsGetCMA[CMA_XC_SELF_MEM],bIsGetCMA[CMA_XC_COBUFF_MEM]);
5071         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], au32CMAMemSCMSize[self]=%x au32CMAMemSCMSize[cobuff]=%x u32DualMiuMemSize=%x\n",__func__,__LINE__,au32CMAMemSCMSize[CMA_XC_SELF_MEM],au32CMAMemSCMSize[CMA_XC_COBUFF_MEM],u32DualMiuMemSize);
5072         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], u32PreCMAMemSCMSize[self]=%x u32PreCMAMemSCMSize[cobuff]=%x \n",__func__,__LINE__,gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM],gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM]);
5073         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], u32PreCMAMemFRCMSize[self]=%x u32PreCMAMemFRCMSize[cobuff]=%x \n",__func__,__LINE__,gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM],gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM]);
5074         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], u32PreCMAMemDualSCMSize=%x \n",__func__, __LINE__, gSrcInfo[eWindow].Status2.u32PreCMAMemDualSCMSize);
5075 
5076         if(  ((bIsGetCMA[CMA_XC_SELF_MEM] == TRUE)&&((au32CMAMemSCMSize[CMA_XC_SELF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM])||(au32CMAMemFRCMSize[CMA_XC_SELF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM])))
5077            ||((bIsGetCMA[CMA_XC_COBUFF_MEM] == TRUE)&&((u32DualMiuMemSize!=gSrcInfo[eWindow].Status2.u32PreCMAMemDualSCMSize)||(au32CMAMemSCMSize[CMA_XC_COBUFF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM])||(au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM]))))
5078         {
5079             Hal_SC_set_freezeimg(pInstance, ENABLE, MAIN_WINDOW);
5080             MS_PHY u32CMAAddr[CMA_XC_MEM_NUM] = {0, };
5081 
5082             if (bIsGetCMA[CMA_XC_SELF_MEM] == TRUE)
5083             {
5084                 if ((au32CMAMemSCMSize[CMA_XC_SELF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM])||(au32CMAMemFRCMSize[CMA_XC_SELF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM]))
5085                 {
5086                         MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
5087                         u32CMAAddr[CMA_XC_SELF_MEM] = MHal_XC_Get_CMA_Addr(pInstance, CMA_XC_SELF_MEM,  au32CMAMemSCMSize[CMA_XC_SELF_MEM]+au32CMAMemFRCMSize[CMA_XC_SELF_MEM], eWindow);
5088                     gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM] = au32CMAMemSCMSize[CMA_XC_SELF_MEM];
5089                     gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM] = au32CMAMemFRCMSize[CMA_XC_SELF_MEM];
5090                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], u32CMAAddr[CMA_XC_SELF_MEM]=%llx \n",__func__, __LINE__, (MS_U64)u32CMAAddr[CMA_XC_SELF_MEM]);
5091                 }
5092             }
5093             else
5094             {
5095                     MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
5096                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], Release self buff!\n",__func__, __LINE__);
5097             }
5098 
5099             if (bIsGetCMA[CMA_XC_COBUFF_MEM] == TRUE)
5100             {
5101                 if ((u32DualMiuMemSize!=gSrcInfo[eWindow].Status2.u32PreCMAMemDualSCMSize)
5102                    ||(au32CMAMemSCMSize[CMA_XC_COBUFF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM])
5103                    ||(au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM]!=gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM]))
5104                 {
5105                         MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
5106                         if (u32DualMiuMemSize != 0)
5107                         {
5108                             u32CMAAddr[CMA_XC_COBUFF_MEM] = MHal_XC_Get_CMA_Addr(pInstance, CMA_XC_COBUFF_MEM, u32DualMiuMemSize, eWindow);
5109                         }
5110                         else
5111                         {
5112                             u32CMAAddr[CMA_XC_COBUFF_MEM] = MHal_XC_Get_CMA_Addr(pInstance, CMA_XC_COBUFF_MEM, au32CMAMemSCMSize[CMA_XC_COBUFF_MEM]+au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM], eWindow);
5113                         }
5114                     gSrcInfo[eWindow].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM] = au32CMAMemSCMSize[CMA_XC_COBUFF_MEM];
5115                     gSrcInfo[eWindow].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM] = au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM];
5116                     gSrcInfo[eWindow].Status2.u32PreCMAMemDualSCMSize = u32DualMiuMemSize;
5117                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], u32CMAAddr[CMA_XC_SELF_MEM]=%llx \n",__func__, __LINE__, (MS_U64)u32CMAAddr[CMA_XC_COBUFF_MEM]);
5118                 }
5119             }
5120             else
5121             {
5122                     MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
5123                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d][CMA], Release cobuff buff!\n",__func__, __LINE__);
5124             }
5125             XC_CMA_CLIENT enXCCMAClient = CMA_XC_MEM_NUM;
5126             if (u32DualMiuMemSize != 0)
5127             {
5128                 enXCCMAClient = CMA_XC_SELF_MEM;
5129             }
5130             else
5131             {
5132                 if (bIsGetCMA[CMA_XC_COBUFF_MEM] == TRUE)
5133                 {
5134                     enXCCMAClient = CMA_XC_COBUFF_MEM;
5135                 }
5136                 else
5137                 {
5138                     enXCCMAClient = CMA_XC_SELF_MEM;
5139                 }
5140             }
5141 #if (HW_DESIGN_4K2K_VER == 4)
5142             if(au32CMAMemSCMSize[enXCCMAClient] == 0)
5143             {
5144                 // default frcm frame buffer address init
5145                 MDrv_XC_SetFRCMFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], eWindow);
5146                 // default frame buffer address init
5147                 MDrv_XC_SetFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], eWindow);
5148             }
5149             else
5150 #endif
5151             {
5152 #if (HW_DESIGN_4K2K_VER == 4)
5153                 // default frcm frame buffer address init
5154                 MDrv_XC_SetFRCMFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient]+au32CMAMemSCMSize[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], eWindow);
5155 #endif
5156                 // default frame buffer address init
5157                 MDrv_XC_SetFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemSCMSize[enXCCMAClient], eWindow);
5158             }
5159 #ifdef UFO_XC_SUPPORT_DUAL_MIU
5160             if (u32DualMiuMemSize != 0)
5161             {
5162                 // default dual frame buffer address init
5163                 MDrv_XC_SetDualFrameBufferAddress(pInstance, u32CMAAddr[CMA_XC_COBUFF_MEM], u32DualMiuMemSize, eWindow);
5164             }
5165 #endif
5166 #if (HW_DESIGN_4K2K_VER == 4)
5167             if ((MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)||MDrv_XC_GetDynamicScalingStatus(pInstance))
5168                 && IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType))
5169             {
5170                 // MM source and DS on
5171                 if(!gSrcInfo[eWindow].bInterlace)
5172                 {
5173                     //DS ON , 4K2K case
5174                     Hal_SC_frcmw_Memory_Write_Request(pInstance, DISABLE, MAIN_WINDOW);
5175                 }
5176                 else
5177                 {
5178                     Hal_SC_frcmw_Memory_Write_Request(pInstance, ENABLE, MAIN_WINDOW);
5179                 }
5180             }
5181             else if ((gSrcInfo[eWindow].stCapWin.width > 3000)
5182                 &&(gSrcInfo[eWindow].stCapWin.height> 1050))
5183             {
5184                 Hal_SC_frcmw_Memory_Write_Request(pInstance, DISABLE, MAIN_WINDOW);
5185             }
5186             else
5187             {
5188                 Hal_SC_frcmw_Memory_Write_Request(pInstance, ENABLE, MAIN_WINDOW);
5189             }
5190 #endif
5191             Hal_SC_set_freezeimg(pInstance, DISABLE, MAIN_WINDOW);
5192         }
5193     }
5194     if (pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].isEnable == TRUE)
5195     {
5196         #ifdef CONFIG_MSTAR_SRAMPD
5197         // control SRAM PD here
5198         if (MHal_XC_Is_SRAM_PowerDown(pInstance) == TRUE)
5199         {
5200             // enable SRAM here
5201             MHal_XC_SRAM_PowerDown_Control(pInstance, FALSE);
5202         }
5203         #endif
5204     }
5205 #endif
5206 #endif
5207 
5208     // Get VB size from MVOP Timing
5209     if(IsSrcTypeDTV(gSrcInfo[eWindow].enInputSourceType) ||
5210         IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType))
5211     {
5212         MVOP_Timing stMVOPTiming;
5213 
5214         memset(&stMVOPTiming, 0, sizeof(MVOP_Timing));
5215 
5216         if(eWindow == MAIN_WINDOW)
5217         {
5218             MDrv_MVOP_GetOutputTiming(&stMVOPTiming);
5219         }
5220         else
5221         {
5222             MDrv_MVOP_SubGetOutputTiming(&stMVOPTiming);
5223         }
5224 
5225         gSrcInfo[eWindow].Status2.u16VirtualBox_Width = stMVOPTiming.u16Width;
5226         gSrcInfo[eWindow].Status2.u16VirtualBox_Height = stMVOPTiming.u16Height;
5227 
5228         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] u16VBox_Htotal:%d u16VBox_Vtotal:%d  \n",__func__,__LINE__,gSrcInfo[eWindow].Status2.u16VirtualBox_Width,gSrcInfo[eWindow].Status2.u16VirtualBox_Height);
5229     }
5230 #if 0
5231     if (MDrv_XC_Get_VirtualBox_Info(pInstance,&pstXCVBox) == TRUE)
5232     {
5233         gSrcInfo[eWindow].Status2.u16VirtualBox_Width = pstXCVBox.u16VBox_Htotal[eWindow];
5234         gSrcInfo[eWindow].Status2.u16VirtualBox_Height = pstXCVBox.u16VBox_Vtotal[eWindow];
5235 
5236         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] u16VBox_Htotal:%d u16VBox_Vtotal:%d  \n",__func__,__LINE__,gSrcInfo[eWindow].Status2.u16VirtualBox_Width,gSrcInfo[eWindow].Status2.u16VirtualBox_Height);
5237     }
5238     else
5239     {
5240         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] MDrv_XC_Get_VirtualBox_Info error!! u16VBox_Htotal:%d u16VBox_Vtotal:%d  \n",__func__,__LINE__,gSrcInfo[eWindow].Status2.u16VirtualBox_Width,gSrcInfo[eWindow].Status2.u16VirtualBox_Height);
5241     }
5242 #endif
5243 
5244 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6)||(HW_DESIGN_4K2K_VER == 7))
5245     XC_InternalStatus SrcInfo;
5246     memcpy(&SrcInfo,&gSrcInfo[eWindow],sizeof(XC_InternalStatus));
5247 
5248     if(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow) )
5249     {
5250         if(  !gSrcInfo[eWindow].bInterlace
5251            ||(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_SAVE_MEM_MODE))
5252         {
5253             SrcInfo.stCapWin.width     = SrcInfo.Status2.u16VirtualBox_Width;
5254             SrcInfo.stCapWin.height    = SrcInfo.Status2.u16VirtualBox_Height;
5255         }
5256         else
5257         {
5258             SrcInfo.stCapWin.width     = gSrcInfo[eWindow].stCropWin.width;
5259             SrcInfo.stCapWin.height    = gSrcInfo[eWindow].stCropWin.height;
5260         }
5261         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] [PQSrcData] width:%d height:%d  \n",__func__,__LINE__,SrcInfo.stCapWin.width,SrcInfo.stCapWin.height);
5262     }
5263     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5264     _MDrv_XC_Set_PQ_SourceData(pInstance, eWindow, gSrcInfo[eWindow].enInputSourceType, &SrcInfo);
5265     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5266 #else
5267     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5268     // Scaler must update source before width / height checking.
5269     _MDrv_XC_Set_PQ_SourceData(pInstance, eWindow, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow]);
5270     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5271 #endif
5272 
5273     //if HW 3d ver > 1 in 3d case, sub PQ source type don't set, because there is no setwin(sub). So load first row in PQ table in quality_map_sub.
5274     //it need set sub PQ source type the same with Main's source type.
5275 #ifndef DISABLE_3D_FUNCTION
5276     if((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) != E_XC_3D_INPUT_MODE_NONE)
5277         && (MDrv_XC_Get_3D_HW_Version() > 1)
5278         && (eWindow == MAIN_WINDOW))
5279     {
5280         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5281         _MDrv_XC_Set_PQ_SourceData(pInstance, SUB_WINDOW, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow]);
5282         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5283     }
5284 #endif
5285     // Capture width & height can not be 0 !!
5286     if (gSrcInfo[eWindow].stCapWin.width == 0 || gSrcInfo[eWindow].stCapWin.height == 0 ||
5287         gSrcInfo[eWindow].stCropWin.width == 0 || gSrcInfo[eWindow].stCropWin.height == 0 ||
5288         gSrcInfo[eWindow].stDispWin.width == 0 || gSrcInfo[eWindow].stDispWin.height == 0 )
5289     {
5290         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Cap/Crop/Disp width or height can not be 0 \n");
5291         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
5292         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5293         return FALSE;
5294     }
5295 
5296     if(eWindow == SUB_WINDOW)
5297     {
5298         //For PIP, enable IP Read/write
5299         _XC_ENTRY(pInstance);
5300         MDrv_XC_SetScalerMemoryRequest(pInstance, TRUE, E_XC_MEMORY_IP_READ_REQUEST, SUB_WINDOW);
5301         MDrv_XC_SetScalerMemoryRequest(pInstance, TRUE, E_XC_MEMORY_IP_WRITE_REQUEST, SUB_WINDOW);
5302         _XC_RETURN(pInstance);
5303     }
5304 
5305 
5306     if (IsSrcTypeVga(gSrcInfo[eWindow].enInputSourceType)   ||
5307         IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) ||
5308         IsSrcTypeScart(gSrcInfo[eWindow].enInputSourceType) )
5309     {
5310 #ifndef DISABLE_3D_FUNCTION
5311         if(!((E_XC_3D_INPUT_MODE_NONE != MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow))
5312               && (SUB_WINDOW == eWindow)))// don't set adc mode when set sub window at 3d
5313         {
5314             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"ADC Set Mode \n");
5315             PQ_ADC_SAMPLING_INFO stPQADCSamplingInfo;
5316             memset(&stPQADCSamplingInfo,0,sizeof(PQ_ADC_SAMPLING_INFO));
5317             if ( IsSrcTypeVga(gSrcInfo[eWindow].enInputSourceType) || IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) )
5318             {
5319                 if(gSrcInfo[eWindow].bHDuplicate)
5320                 {
5321                     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5322                     MDrv_XC_ADC_GetPQADCSamplingInfo(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], &stPQADCSamplingInfo, eWindow);
5323                     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5324                 }
5325             }
5326 
5327             MDrv_XC_ADC_SetMode(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], &stPQADCSamplingInfo, eWindow);
5328         }
5329 #endif
5330     }
5331     else
5332     {
5333         MDrv_XC_ADC_SCART_RGB_setMode(pInstance,FALSE);
5334     }
5335     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5336 
5337 #ifdef ADC_BYPASS_YPBPR_MACRO_VISION_PATCH
5338     // patch for china player
5339     // there are some undefined signal between sync and DE in YPbPr fullHD
5340     // so we ignore this signal with coast window
5341     if(IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) && (!pstXC_SetWin_Info->bInterlace))
5342     {
5343         //MS_U16 u16ADC_PC_Clk = 0;
5344         //u16ADC_PC_Clk = MDrv_XC_ADC_GetPcClock(pInstance);
5345         //if(u16ADC_PC_Clk>2635 && u16ADC_PC_Clk<2645 )
5346         if((1920 == gSrcInfo[eWindow].stCapWin.width) && (1080 == gSrcInfo[eWindow].stCapWin.height))
5347         {
5348             MDrv_SC_ip_set_coast_window(pInstance,0x0F, 0x0F, eWindow );
5349         }
5350     }
5351 #endif
5352 
5353     msAPI_Scaler_SetMode(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], eWindow);
5354 
5355     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5356 #if ENABLE_REQUEST_FBL
5357     if(!(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow)) )
5358     {
5359         if ( (MDrv_XC_IsRequestFrameBufferLessMode(pInstance) && MDrv_XC_IsCurrentRequest_FrameBufferLessMode(pInstance))
5360              && (!MDrv_XC_IsCurrentFrameBufferLessMode(pInstance)) )
5361         {
5362             printf("====No Crop for RFBL==\n");
5363 
5364             gSrcInfo[eWindow].stCropWin.x = 0;
5365             gSrcInfo[eWindow].stCropWin.y = 0;
5366             gSrcInfo[eWindow].stCropWin.width = gSrcInfo[eWindow].stCapWin.width;
5367             gSrcInfo[eWindow].stCropWin.height= gSrcInfo[eWindow].stCapWin.height;
5368         }
5369     }
5370 #endif
5371 
5372     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"UCNR enabled: %s \n", (MDrv_XC_Get_OPWriteOffEnable(pInstance, eWindow) == TRUE) ? "NO" : "YES");
5373 
5374 #ifdef ENABLE_SCALING_WO_MUTE
5375     if(DISABLE == gSrcInfo[eWindow].bBlackscreenEnabled)
5376     {
5377         MDrv_SC_Adjust_Prescaling_Ratio(pInstance, eWindow);
5378     }
5379 #endif
5380 
5381     MDrv_SC_set_2p_mode(pInstance, pstXC_SetWin_Info, eWindow);
5382 
5383     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5384 
5385     MDrv_SC_set_prescaling_ratio(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], eWindow );
5386     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5387     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CapWin  x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCapWin.x, gSrcInfo[eWindow].stCapWin.y, gSrcInfo[eWindow].stCapWin.width, gSrcInfo[eWindow].stCapWin.height);
5388     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CropWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCropWin.x, gSrcInfo[eWindow].stCropWin.y, gSrcInfo[eWindow].stCropWin.width, gSrcInfo[eWindow].stCropWin.height);
5389     // SCMI miu dual mode Phase1: Dual enable under hdmirx 4k2k, dual bw ration 2:2
5390     // User should judge when enable dual by call dual enable api. So remove auto start dual enable.
5391 #if 0
5392 #ifndef DONT_USE_CMA
5393 #ifdef UFO_XC_SUPPORT_DUAL_MIU
5394     if (eWindow == MAIN_WINDOW)
5395     {
5396         if (IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType) && ((gSrcInfo[(eWindow)].u16H_SizeAfterPreScaling> 1920) && (gSrcInfo[(eWindow)].u16V_SizeAfterPreScaling> 1080)))
5397         {
5398             MDrv_XC_EnableMiuDualMode(pInstance, TRUE, 2, 2, MAIN_WINDOW);
5399         }
5400     }
5401 #endif
5402 #endif
5403 #endif
5404 
5405     MDrv_SC_set_crop_window(pInstance, &gSrcInfo[eWindow], eWindow );
5406 
5407     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CapWin  x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCapWin.x, gSrcInfo[eWindow].stCapWin.y, gSrcInfo[eWindow].stCapWin.width, gSrcInfo[eWindow].stCapWin.height);
5408     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CropWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCropWin.x, gSrcInfo[eWindow].stCropWin.y, gSrcInfo[eWindow].stCropWin.width, gSrcInfo[eWindow].stCropWin.height);
5409     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stDispWin.x,gSrcInfo[eWindow].stDispWin.y, gSrcInfo[eWindow].stDispWin.width, gSrcInfo[eWindow].stDispWin.height);
5410     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5411     MDrv_SC_set_postscaling_ratio(pInstance, &gSrcInfo[eWindow], eWindow );
5412 
5413 #ifdef ENABLE_TV_SC2_PQ
5414     if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
5415 #endif
5416     {
5417         MS_BOOL bTmpFBL = FALSE;
5418 #ifdef UFO_XC_FB_LEVEL
5419         if((gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_FBL) || (gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_RFBL_DI))
5420         {
5421             bTmpFBL = TRUE;
5422         }
5423 #else
5424         bTmpFBL = gSrcInfo[eWindow].bFBL;
5425 #endif
5426         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling != NULL)
5427         {
5428 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5429             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling(
5430                             (psXCInstPri->u32DeviceID == 1) ?
5431                             PQ_SUB_WINDOW :
5432                             PQ_MAIN_WINDOW,
5433                             bTmpFBL,
5434                             gSrcInfo[eWindow].bPreV_ScalingDown,
5435                             gSrcInfo[eWindow].ScaledCropWin.y);
5436 #else
5437             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling(
5438                             eWindow == SUB_WINDOW ?
5439                             PQ_SUB_WINDOW :
5440                             PQ_MAIN_WINDOW,
5441                             bTmpFBL,
5442                             gSrcInfo[eWindow].bPreV_ScalingDown,
5443                             gSrcInfo[eWindow].ScaledCropWin.y);
5444 #endif
5445         }
5446     }
5447 #ifdef ENABLE_TV_SC2_PQ
5448     else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
5449     {
5450             MS_BOOL bTmpFBL = FALSE;
5451 #ifdef UFO_XC_FB_LEVEL
5452         if((gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_FBL) || (gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_RFBL_DI))
5453         {
5454             bTmpFBL = TRUE;
5455         }
5456 #else
5457         bTmpFBL = gSrcInfo[eWindow].bFBL;
5458 #endif
5459 
5460         if (s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling_ex != NULL)
5461         {
5462             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling_ex(psXCInstPri->u32DeviceID,
5463                             eWindow == SUB_WINDOW ?
5464                             PQ_SUB_WINDOW :
5465                             PQ_MAIN_WINDOW,
5466                             bTmpFBL,
5467                             gSrcInfo[eWindow].bPreV_ScalingDown,
5468                             gSrcInfo[eWindow].ScaledCropWin.y);
5469         }
5470     }
5471 #endif
5472     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5473     // FIXME: direct use variable instead of stDBreg?
5474     _XC_ENTRY(pInstance);
5475 
5476 #ifndef DISABLE_3D_FUNCTION
5477     //for 3D handle invalid crop window,or else LR status may be inverse.
5478     if(E_XC_3D_INPUT_CHECK_BORAD == MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow))
5479     {
5480         gSrcInfo[eWindow].ScaledCropWin.y &= ~0x1;
5481         gSrcInfo[eWindow].ScaledCropWin.x &= ~0x1;
5482         gSrcInfo[eWindow].ScaledCropWin.height &= ~0x1;
5483         gSrcInfo[eWindow].ScaledCropWin.width &= ~0x1;
5484     }
5485     else if(E_XC_3D_INPUT_LINE_ALTERNATIVE == MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow))
5486     {
5487         gSrcInfo[eWindow].ScaledCropWin.y &= ~0x1;
5488         gSrcInfo[eWindow].ScaledCropWin.height &= ~0x1;
5489     }
5490     else if(E_XC_3D_INPUT_PIXEL_ALTERNATIVE == MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow))
5491     {
5492         gSrcInfo[eWindow].ScaledCropWin.x &= ~0x1;
5493         gSrcInfo[eWindow].ScaledCropWin.width &= ~0x1;
5494     }
5495 #endif
5496 #if (HW_DESIGN_4K2K_VER == 4)
5497     // temp solution for monaco
5498     // MDrv_SC_set_fetch_number_limit will change by MDrv_SC_set_frcm_fetch_number_limit when it stable
5499     // but function name always is MDrv_SC_set_fetch_number_limit
5500     MDrv_SC_set_frcm_fetch_number_limit(pInstance, &gSrcInfo[eWindow], eWindow );
5501 #else
5502     MDrv_SC_set_fetch_number_limit(pInstance, &gSrcInfo[eWindow], eWindow );
5503 #endif
5504     MDrv_sc_set_capture_window(pInstance, eWindow );
5505 
5506 #if VERIFY_MVIDEO_FPGA //non-de-interlace function=> celear second frame half garbage
5507     if(binterlace)
5508     {
5509         gSrcInfo[eWindow].stDispWin.height/= 2;
5510         gSrcInfo[eWindow].u16InputVTotal /= 2;
5511     }
5512 #endif
5513 
5514 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
5515     // For Manhattan, FSC+FRC
5516     if ((eWindow == MAIN_WINDOW) &&
5517         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled))
5518     {
5519         if (bChangeDisplaySize)
5520         {
5521             // FHD to FSC case, but bk10 display window need to be original size
5522             gSrcInfo[eWindow].stDispWin.x = gSrcInfo[eWindow].stDispWin.x*2 - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart;
5523             gSrcInfo[eWindow].stDispWin.width = gSrcInfo[eWindow].stDispWin.width*2;
5524             gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y*2 - pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
5525             gSrcInfo[eWindow].stDispWin.height = gSrcInfo[eWindow].stDispWin.height*2;
5526 
5527             // for custom scaling case
5528             if(gSrcInfo[eWindow].bHCusScaling)
5529             {
5530                 gSrcInfo[eWindow].u16HCusScalingDst = gSrcInfo[eWindow].u16HCusScalingDst*2;
5531             }
5532             if(gSrcInfo[eWindow].bVCusScaling)
5533             {
5534                 gSrcInfo[eWindow].u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst*2;
5535             }
5536         }
5537     }
5538 #endif
5539 
5540 #ifdef PATCH_TCON_BRING_UP
5541         if((((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type) == E_XC_PNL_LPLL_EPI28_12P)
5542           && !(strcmp(panelName_UD_VB1_8LANE_DRDEPI,MDrv_PNL_GetName())))
5543         {
5544             gSrcInfo[eWindow].stDispWin.y = gSrcInfo[eWindow].stDispWin.y+1;
5545         }
5546 #endif
5547 
5548     // FIXME: direct use variable instead of stDBreg?
5549     MDrv_SC_set_display_window(pInstance,  eWindow );
5550 
5551     #ifdef MONACO_SC2_PATCH
5552     // patch!!
5553     if(psXCInstPri->u32DeviceID == 1)
5554     {
5555         Hal_SC_set_de_window(pInstance ,&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo);
5556     }
5557     #endif
5558 
5559     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Physical DispWin HStart: %4u  HEnd: %4u  Vstart: %4u  VEnd: %4u \n",
5560                                        pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart,
5561                                        pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd,
5562                                        pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisStart,
5563                                        pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_DisEnd);
5564 
5565     // Adjust FCLK by different case
5566 #ifdef UFO_XC_FB_LEVEL
5567     if((gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_FBL)  || (gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_RFBL_DI))//FIXME
5568 #else
5569     if (gSrcInfo[eWindow].bFBL)
5570 #endif
5571     {
5572         MDrv_SC_set_Fclk(pInstance, EN_FCLK_FBL);
5573     }
5574     else
5575     {
5576         MDrv_SC_set_Fclk(pInstance, EN_FCLK_NORMAL);
5577     }
5578 
5579     // Adjust display line buffer start mode by different case
5580 #ifdef UFO_XC_FB_LEVEL
5581     if((gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_FBL)  || (gSrcInfo[eWindow].eFBLevel == E_XC_FB_LEVEL_RFBL_DI))
5582 #else
5583     if (gSrcInfo[eWindow].bFBL || gSrcInfo[eWindow].bR_FBL)
5584 #endif
5585     {
5586         MDrv_SC_SetDisplay_Start_Mode(pInstance, DISABLE);
5587     }
5588     else
5589     {
5590         MDrv_SC_SetDisplay_Start_Mode(pInstance, ENABLE);
5591     }
5592 
5593     if (bDualWindow == TRUE)
5594     {
5595         if (eWindow == MAIN_WINDOW)
5596         {
5597             memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.stMainDBreg, &pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg, sizeof(SC_SWDB_INFO));
5598             pXCResourcePrivate->stdrvXC_MVideo._bSetDualMainWinDone = TRUE;
5599         }
5600         else
5601         {
5602             memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.stSubDBreg
5603                    , &pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg, sizeof(SC_SWDB_INFO));
5604             pXCResourcePrivate->stdrvXC_MVideo._bSetDualSubWinDone = TRUE;
5605         }
5606 
5607         if (pXCResourcePrivate->stdrvXC_MVideo._bSetDualMainWinDone
5608             && pXCResourcePrivate->stdrvXC_MVideo._bSetDualSubWinDone)
5609         {
5610             MDrv_SC_dual_sw_db(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.stMainDBreg
5611                                , &pXCResourcePrivate->stdrvXC_MVideo_Context.stSubDBreg);
5612             pXCResourcePrivate->stdrvXC_MVideo._bSetDualMainWinDone = FALSE;
5613             pXCResourcePrivate->stdrvXC_MVideo._bSetDualSubWinDone = FALSE;
5614         }
5615     }
5616     else
5617     {
5618         if(!MDrv_XC_Is_SupportSWDS(pInstance))
5619         {
5620             MDrv_SC_sw_db(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg, eWindow );
5621         }
5622     }
5623 
5624 #if (SUPPORT_3D_DS == 0)
5625 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6)||(HW_DESIGN_4K2K_VER == 7))
5626     if(MDrv_XC_Is_SupportSWDS(pInstance))
5627     {
5628 #if (defined (ANDROID)&& defined(UFO_XC_DS_PQ))
5629         MDrv_PQ_set_imode_PQDS(pstXC_SetWin_Info->bInterlace);
5630 #endif
5631         MDrv_SWDS_AddCmd(pInstance,&pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg,eWindow);
5632         MDrv_SWDS_Fire(pInstance,eWindow);
5633     }
5634 #endif
5635 #endif
5636 
5637     //For VIP peaking setting
5638     MDrv_XC_VIP_Peaking_Setting(pInstance, eWindow);
5639 
5640 #if SUPPORT_SEAMLESS_ZAPPING
5641     if(INPUT_SOURCE_DTV == gSrcInfo[eWindow].enInputSourceType)
5642     {
5643         //When HDMI 4K2K open compress mode change to PX2 mode need to toggle the compress flag clear
5644         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_40_L, BIT(0), BIT(0));
5645         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_40_L, 0, BIT(0));
5646     }
5647 #endif
5648 
5649     _XC_RETURN(pInstance);
5650     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5651 
5652     if(bRet == FALSE)
5653     {
5654 #ifndef DISABLE_3D_FUNCTION
5655         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5656         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5657         MDrv_XC_3D_LoadReg(pInstance, MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow), MDrv_XC_Get_3D_Output_Mode(pInstance), &gSrcInfo[eWindow], eWindow);
5658 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
5659         if(!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
5660             && pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled)
5661         {
5662             Hal_SC_3D_Enable_FRC_LR_Flag(pInstance, FALSE); //disable FRC LR  flag
5663             MDrv_XC_FRC_Set_Input3DFormat(pInstance, E_XC_3D_INPUT_MODE_NONE);
5664             MDrv_XC_FRC_R2_Set_InputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5665                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
5666             MDrv_XC_FRC_R2_Set_OutputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5667                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
5668         }
5669 #endif
5670         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5671 #endif
5672     }
5673 
5674 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 3)) // only Napoli need this
5675     // SW patch for MM 4K BW issue
5676     if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal > 3000)
5677         && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal > 2000)
5678         && (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch > 1920)
5679         && (pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16VLen > 1080))
5680     {
5681         /// for BW issue
5682         if ((IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType))||(IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType)))
5683         {
5684             // SC
5685             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L, BIT(14), BIT(14));  // turn off ip read for bw issue
5686         }
5687         else
5688         {
5689 #ifdef UFO_XC_FB_LEVEL
5690             if(gSrcInfo[MAIN_WINDOW].eFBLevel == E_XC_FB_LEVEL_FB)//FIXME
5691 #else
5692             if(!gSrcInfo[MAIN_WINDOW].bFBL)
5693 #endif
5694             {
5695                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L, 0x00, BIT(14));
5696             }
5697         }
5698     }
5699     else
5700     {
5701 #ifdef UFO_XC_FB_LEVEL
5702         if(gSrcInfo[MAIN_WINDOW].eFBLevel == E_XC_FB_LEVEL_FB)//FIXME
5703 #else
5704         if(!gSrcInfo[MAIN_WINDOW].bFBL)
5705 #endif
5706         {
5707             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L, 0x00, BIT(14));
5708         }
5709     }
5710     // SC opm line buffer lens
5711     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_24_L, 0xA03E); // OP read request
5712     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_68_L, 0x3E00); // IPM arbiter
5713     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_63_L, 0x3F00); // IPM arbiter
5714     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_22_L, 0x2020); // IPM request length
5715 
5716 #endif
5717 
5718     #if (HW_DESIGN_4K2K_VER == 4)
5719     //SW patch for HDMI 4K@60 BW issue, mantis: 782590
5720     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal > 3000)          // 4K output
5721         && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal > 2000)
5722         && (IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType))                                         // HDMI
5723         && (pstXC_SetWin_Info->stCapWin.width >= 0x780)                                                 // 4K2K@50,60 input
5724         && (pstXC_SetWin_Info->stCapWin.height >= 0x870)
5725         && (pstXC_SetWin_Info->u16InputVFreq >= 490))
5726     {
5727         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_24_L, 0x0008, 0x00FF);  // OP read request
5728     }
5729     else
5730     {
5731         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_24_L, 0x0020, 0x00FF);
5732     }
5733 
5734     MS_U16 u16Height  = SC_R2BYTEMSK(0, REG_SC_BK01_06_L, 0x1FFF);
5735     MS_U16 u16Vtt     = SC_R2BYTEMSK(0, REG_SC_BK01_1F_L, 0x1FFF);
5736     if (  (pstXC_SetWin_Info->enInputSourceType == INPUT_SOURCE_VGA)
5737         &&(u16Vtt - u16Height <= 5))
5738     {
5739         MDrv_XC_MLoad_set_IP_trig_p(pInstance, 0x02, 0x03);
5740         MDrv_XC_MemControl_Switch_Method_By_Vcnt(pInstance, FALSE, 0x0);
5741     }
5742     else if(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow) )
5743     {
5744         MDrv_XC_MLoad_set_IP_trig_p(pInstance, 0x01, 0x02);
5745         MDrv_XC_MemControl_Switch_Method_By_Vcnt(pInstance, FALSE, 0x00);
5746         MDrv_XC_edclk_pd_control(pInstance, FALSE, 0x00, 0x00);
5747     }
5748 
5749 #if(HW_DESIGN_3D_VER == 5) //monaco/muji mode
5750    //several lines of garbage on the top FPI to SBSH
5751    else if ((MApi_XC_Get_3D_Input_Mode(MAIN_WINDOW) == E_XC_3D_INPUT_FRAME_PACKING)
5752          && (pstXC_SetWin_Info->stCapWin.height == DOUBLEHD_1080X2I_VSIZE))
5753     {
5754         MS_U16 u16TrainTriggerPoint = 0;
5755         MS_U16 u16DispTriggerPoint = 0;
5756         MDrv_XC_MLoad_get_IP_trig_p(pInstance, &u16TrainTriggerPoint, &u16DispTriggerPoint);
5757         if((u16TrainTriggerPoint != 0x00) && (u16DispTriggerPoint != 0x01))
5758         {
5759             MDrv_XC_MLoad_get_IP_trig_p(pInstance, &pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_AUTO_TUNE_AREA_TRIG], &pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_DISP_AREA_TRIG]);
5760             MDrv_XC_MLoad_set_IP_trig_p(pInstance, 0x0000, 0x0001);
5761         }
5762     }
5763 #endif
5764 
5765     else
5766     {
5767         MS_U16 u16TrainTriggerPoint = 0;
5768         MS_U16 u16DispTriggerPoint = 0;
5769         MDrv_XC_MLoad_get_IP_trig_p(pInstance, &u16TrainTriggerPoint, &u16DispTriggerPoint);
5770 
5771         if ((pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_AUTO_TUNE_AREA_TRIG] != u16TrainTriggerPoint)
5772             || (pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_DISP_AREA_TRIG] != u16DispTriggerPoint))
5773         {
5774             MDrv_XC_MemControl_Switch_Method_By_Vcnt(pInstance, TRUE, 0x04);
5775             MDrv_XC_MLoad_set_IP_trig_p(pInstance, pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_AUTO_TUNE_AREA_TRIG], pXCResourcePrivate->sthal_SC.u16OldValue[E_STORE_VALUE_IP_DISP_AREA_TRIG]);
5776         }
5777     }
5778 
5779     if( !(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow)) )
5780     {
5781         // not need open edclk control when vblanking is little
5782         if (u16Vtt - u16Height <= 24)
5783         {
5784             MDrv_XC_edclk_pd_control(pInstance, FALSE, 0x00, 0x00);
5785         }
5786         else
5787         {
5788             MDrv_XC_edclk_pd_control(pInstance, TRUE, 0x04, 0x08);
5789         }
5790     }
5791 
5792     //DTV 1080i patch for mantis:0735773
5793     MDrv_XC_DTVPatch(pInstance,eWindow);
5794 
5795 #endif
5796 
5797 #if (defined(PATCH_ENABLE_MVOP_HANDSHAKE_MODE_WHEN_BW_NOT_ENOUGH_IN_120HZ_PANEL))
5798 #if (PATCH_ENABLE_MVOP_HANDSHAKE_MODE_WHEN_BW_NOT_ENOUGH_IN_120HZ_PANEL == TRUE)
5799     if(IsVBY1_16LANE(u8LPLL_Type)
5800        &&(((MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)||MDrv_XC_GetDynamicScalingStatus(pInstance)) && (IS_DS_4K2K(eWindow)) && (gSrcInfo[eWindow].u16InputVFreq > 330)) //QHD DS case
5801        ||(IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType) && IS_INPUT_4K2K(eWindow) && (gSrcInfo[eWindow].u16InputVFreq > 330))))
5802     {
5803        //MVOP
5804        MS_BOOL bHSK = TRUE;
5805        MVOP_Handle stMvopHd = { E_MVOP_MODULE_MAIN };
5806        MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_HANDSHAKE_MODE, &bHSK);
5807        //XC  0x1302_10 = 0x25
5808        SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK02_10_L, 0x0025, 0xFFFF);
5809     }
5810     else
5811     {
5812        //MVOP
5813        MS_BOOL bHSK = FALSE;
5814        MVOP_Handle stMvopHd = { E_MVOP_MODULE_MAIN };
5815        MDrv_MVOP_SetCommand(&stMvopHd, E_MVOP_CMD_SET_HANDSHAKE_MODE, &bHSK);
5816        //XC  0x1302_10 = 0x00
5817        SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK02_10_L, 0x0000, 0xFFFF);
5818     }
5819 #endif
5820 #endif
5821 
5822 #if (HW_DESIGN_4K2K_VER == 6)
5823     if(IsSrcTypeDTV(gSrcInfo[MAIN_WINDOW].enInputSourceType) || (IsSrcTypeStorage(gSrcInfo[MAIN_WINDOW].enInputSourceType)))//MVOP source
5824     {
5825         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_10_L, BIT(2)) == 0)
5826         {
5827             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5D_L, 0x1018 , 0xFFFF);//return to HW default value
5828         }
5829     }
5830 #endif
5831 
5832 #if (HW_DESIGN_4K2K_VER == 7)  //Kano Patch
5833     if((psXCInstPri->u32DeviceID==0) && (eWindow == MAIN_WINDOW))
5834     {
5835         //for 60in/24out tearing issue, HW says XC FRC case need enable BK11_05[9]. but need more test to confirm this solution is OK.
5836         //BK11_05[9] use to protect write too fast.
5837         if((((gSrcInfo[eWindow].enInputSourceType)==INPUT_SOURCE_STORAGE) || ((gSrcInfo[eWindow].enInputSourceType)==INPUT_SOURCE_STORAGE2))
5838             && gSrcInfo[eWindow].bInterlace)
5839         {
5840             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, BIT(9) , BIT(9));
5841         }
5842         else
5843         {
5844             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, 0 , BIT(9));
5845         }
5846     }
5847 #endif
5848     if (((pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == TRUE) ||
5849          (pXCResourcePrivate->sthal_Optee.op_tee_xc[SUB_WINDOW].isEnable == TRUE)) &&
5850         ((gSrcInfo[eWindow].Status2.eMirrorMode == MIRROR_H_ONLY) ||
5851          (gSrcInfo[eWindow].Status2.eMirrorMode == MIRROR_V_ONLY) ||
5852          (gSrcInfo[eWindow].Status2.eMirrorMode == MIRROR_HV)))
5853     {
5854         XC_OPTEE_HANDLER st_xc_handler;
5855         st_xc_handler.eWindow = eWindow;
5856         MDrv_XC_OPTEE_Update(pInstance, E_XC_OPTEE_UPDATE_HANDLER, st_xc_handler);
5857     }
5858 #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
5859     u32SetWindowTime = MsOS_GetSystemTime()-u32SetWindowTime;
5860 #endif
5861     return bRet;
5862 }
5863 
5864 //-------------------------------------------------------------------------------------------------
5865 /// Set the specific window
5866 /// @param  pstXC_SetWin_Info      \b IN: the information of the window setting
5867 /// @param  u32InitDataLen         \b IN: the length of the pstXC_SetWin_Info
5868 /// @param  eWindow                \b IN: which window we are going to set
5869 /// @return @ref MS_BOOL
5870 //-------------------------------------------------------------------------------------------------
MApi_XC_SetWindow_U2(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,MS_U32 u32InitDataLen,SCALER_WIN eWindow)5871 MS_BOOL MApi_XC_SetWindow_U2(void* pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, MS_U32 u32InitDataLen, SCALER_WIN eWindow)
5872 {
5873     MS_BOOL bRet = FALSE;
5874     MS_BOOL bEnable8LBMode = FALSE;
5875     XC_INITMISC stXC_Init_Misc;
5876     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5877     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5878     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5879     if (pstXC_SetWin_Info == NULL)
5880     {
5881         printf("[%s,%5d]Invalid parameter !\n",__FUNCTION__,__LINE__);
5882         return FALSE;
5883     }
5884 #ifdef MSOS_TYPE_LINUX_KERNEL
5885     /*
5886     ** Save setwindow info for str
5887     */
5888     void *pModule;
5889     UtopiaInstanceGetModule(pInstance, &pModule);
5890     XC_REGS_SAVE_AREA *pXCResourceStr = NULL;
5891     UtopiaModuleGetSTRPrivate(pModule, (void**)&pXCResourceStr);
5892     if (pstXC_SetWin_Info != NULL)
5893     {
5894         memcpy(&pXCResourceStr->pstXC_SetWin_Info[eWindow],pstXC_SetWin_Info,sizeof(XC_SETWIN_INFO));
5895     }
5896 #endif
5897     _SETWINDOW_ENTRY();
5898 
5899     PSTXC_DS_CMDCNT.u16CMDCNT_IPM =0;
5900     PSTXC_DS_CMDCNT.u16CMDCNT_IPS =0;
5901     PSTXC_DS_CMDCNT.u16CMDCNT_OPM =0;
5902     PSTXC_DS_CMDCNT.u16CMDCNT_OPS =0;
5903 
5904     memset(&stXC_Init_Misc,0,sizeof(XC_INITMISC));
5905 
5906     if(MDrv_XC_Is_SupportSWDS(pInstance))
5907     {
5908         g_bSWDSGenScenario = TRUE;
5909     }
5910     else
5911     {
5912         g_bSWDSGenScenario = FALSE;
5913     }
5914 
5915 #ifdef UFO_XC_HDR
5916 #if (UFO_XC_HDR_VERSION == 2)
5917     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5918     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5919 
5920     //Only SC0 can set HDR (MDrv_XC_HDR_SetWindow can only set sc0 to HDR)
5921     if ((psXCInstPri->u32DeviceID == 0) && (eWindow == MAIN_WINDOW) && (pstXC_SetWin_Info != NULL))
5922     {
5923         if (gSrcInfo[eWindow].bR_FBL)
5924         {
5925             MDrv_XC_HDR_SetWindow(pInstance, pstXC_SetWin_Info->stCropWin);
5926         }
5927         else
5928         {
5929             MDrv_XC_HDR_SetWindow(pInstance, pstXC_SetWin_Info->stCapWin);
5930         }
5931     }
5932     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5933 #endif
5934 #endif
5935 
5936     if (_MApi_XC_SetWindow(pInstance, pstXC_SetWin_Info, sizeof(XC_SETWIN_INFO), FALSE, eWindow) == FALSE)
5937     {
5938         goto SETWINDOW_EXIT;
5939     }
5940 
5941 #ifndef DISABLE_3D_FUNCTION
5942     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
5943     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5944     MDrv_XC_3D_LoadReg(pInstance, MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow), MDrv_XC_Get_3D_Output_Mode(pInstance), &gSrcInfo[eWindow], eWindow);
5945     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
5946 
5947 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
5948     if(!(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
5949         && pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled)
5950     {
5951         if(pXCResourcePrivate->stdrvXC_3D._bFRC3DEnabled )//FRC 3D enabled
5952         {
5953             MDrv_XC_FRC_Set_Input3DFormat(pInstance, pXCResourcePrivate->stdrvXC_3D._eFrcInput3DMode);
5954 
5955             if(E_XC_3D_OUTPUT_FRAME_ALTERNATIVE == pXCResourcePrivate->stdrvXC_3D._eFrcOutput3DMode)//frc output FA
5956             {
5957                 Hal_SC_3D_Enable_FRC_LR_Flag(pInstance, TRUE); //use FRC LR flag
5958             }
5959             else
5960             {
5961                 Hal_SC_3D_Enable_FRC_LR_Flag(pInstance, FALSE); //use SC LR flag
5962             }
5963 
5964             if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW))
5965             {
5966                 if(IS_OUTPUT_4K1K_120HZ_PANEL() || IS_OUTPUT_4K0_5K_240HZ_PANEL())
5967                 {
5968                     MDrv_XC_FRC_R2_Set_InputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5969                                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height*2);
5970                     MDrv_XC_FRC_R2_Set_OutputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5971                                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
5972                 }
5973             }
5974         }
5975         else
5976         {
5977             Hal_SC_3D_Enable_FRC_LR_Flag(pInstance, FALSE); //disable FRC LR  flag
5978             MDrv_XC_FRC_Set_Input3DFormat(pInstance, E_XC_3D_INPUT_MODE_NONE);
5979             MDrv_XC_FRC_R2_Set_InputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5980                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
5981             MDrv_XC_FRC_R2_Set_OutputFrameSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, \
5982                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
5983         }
5984     }
5985 #endif
5986 #endif
5987 
5988 #if (SUPPORT_3D_DS == 1)
5989 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6))
5990     if(MDrv_XC_Is_SupportSWDS(pInstance))
5991     {
5992 #if (defined (ANDROID)&& defined(UFO_XC_DS_PQ))
5993         MDrv_PQ_set_imode_PQDS(pstXC_SetWin_Info->bInterlace);
5994 #endif
5995         MDrv_SWDS_AddCmd(pInstance,&pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg,eWindow);
5996         MDrv_SWDS_Fire(pInstance,eWindow);
5997     }
5998 #endif
5999 #endif
6000     bRet = TRUE;
6001 
6002     //all return should come here, because this code will enable opm write limit addr protect
6003 SETWINDOW_EXIT:
6004     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6005     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6006     memcpy(&(gSrcInfo[eWindow].stStatusnodelay.stDispWin), &(gSrcInfo[eWindow].stDispWin), sizeof(MS_WINDOW_TYPE));
6007 
6008     if(eWindow == MAIN_WINDOW)
6009     {
6010     #if (ENABLE_OPM_WRITE_SUPPORTED)
6011         MS_PHY u32OPWLimitBase = 0x00;
6012         u32OPWLimitBase = ((MDrv_XC_GetIPMBase(pInstance, 0, eWindow)*BYTE_PER_WORD + MDrv_XC_GetDNRBufSize(pInstance, eWindow)) / BYTE_PER_WORD - 1) ;
6013         _XC_ENTRY(pInstance);
6014         MDrv_SC_set_opm_write_limit(pInstance, TRUE, 0 , u32OPWLimitBase , eWindow);
6015         _XC_RETURN(pInstance);
6016 #ifdef UFO_XC_SUPPORT_DUAL_MIU
6017         _XC_ENTRY(pInstance);
6018         u32OPWLimitBase = ((MDrv_XC_GetDualIPMBase(pInstance, 0, eWindow)*BYTE_PER_WORD + MDrv_XC_GetDualDNRBufSize(pInstance, eWindow)) / BYTE_PER_WORD - 1) ;
6019         MDrv_SC_set_dual_opm_write_limit(pInstance, FALSE, 0 , u32OPWLimitBase , eWindow);
6020         _XC_RETURN(pInstance);
6021 #endif
6022 
6023     #endif
6024     }
6025 
6026 //there is xc performance issue for napoli hw, so need enable 8 LB mode by designer's advice
6027 #if ENABLE_DI_8LB_MODE
6028     bEnable8LBMode = ((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_MODE_NONE)
6029                      && (MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_MODE_NONE)
6030                      && MDrv_XC_Is2K2KToFrc(pInstance)
6031                      && (((gSrcInfo[MAIN_WINDOW].stCapWin.width == DOUBLEHD_1080X2P_HSIZE)
6032                              && (gSrcInfo[MAIN_WINDOW].stCapWin.height > (DOUBLEHD_1080X2P_VSIZE - DOUBLEHD_1080X2P_GARBAGE_VSIZE - 10))
6033                              && (!IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType))) // MM case, enable UC costs too much BW, make video temp garbage, so not enable UC for MM
6034                          || (MApi_XC_Is_SubWindowEanble()//For dualview case: enable DI8LB to eliminate bubble for scaling performance issue.
6035                              && (gSrcInfo[SUB_WINDOW].stDispWin.height ==1080)&& (gSrcInfo[SUB_WINDOW].stDispWin.width ==1920))));
6036 #endif
6037 
6038     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6039 
6040 #ifdef ENABLE_TV_SC2_PQ
6041     if (psXCInstPri->u32DeviceID == PQ_XC_ID_0)
6042 #endif
6043     {
6044         if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl)
6045         {
6046 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
6047             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl((psXCInstPri->u32DeviceID == 1)?PQ_SUB_WINDOW:PQ_MAIN_WINDOW,
6048                                E_PQ_IOCTL_SET_UCFEATURE,
6049                                (void *)&bEnable8LBMode,
6050                                sizeof(MS_BOOL));
6051 #else
6052             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl((PQ_WIN)eWindow,
6053                                        E_PQ_IOCTL_SET_UCFEATURE,
6054                                        (void *)&bEnable8LBMode,
6055                                        sizeof(MS_BOOL));
6056 #endif
6057         }
6058     }
6059 #ifdef ENABLE_TV_SC2_PQ
6060     else if (psXCInstPri->u32DeviceID == PQ_XC_ID_1)
6061     {
6062         if(s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl_ex)
6063         {
6064             s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl_ex(psXCInstPri->u32DeviceID, (PQ_WIN)eWindow,
6065                                        E_PQ_IOCTL_SET_UCFEATURE,
6066                                        (void *)&bEnable8LBMode,
6067                                        sizeof(MS_BOOL));
6068         }
6069     }
6070 #endif
6071 
6072 
6073 #if (HW_DESIGN_4K2K_VER == 6)
6074 
6075 // For HW limitation, we need disable UC feature in Src * 1.5 > Dst(Post Horizontal Scaling)case   (OPW is 1P engine)
6076 
6077     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width == 3840) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == 2160))
6078     {
6079         if(IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) || IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType) || IsSrcTypeDVI(gSrcInfo[eWindow].enInputSourceType))
6080         {
6081             if(gSrcInfo[eWindow].u16H_SizeAfterPreScaling * 15 >  gSrcInfo[eWindow].stDispWin.width * 10)
6082             {
6083                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, 0x0 ,BIT(15));//disable UC feature
6084             }
6085         }
6086     }
6087 #endif
6088 
6089 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6090     // For Manhattan, FSC+FRC
6091     // 1. load FSC Qmap here
6092     // 2. load FRC 3D table here
6093     // 3. send R2 cmd to FRC
6094     // 4. control FRC clk
6095     // 5. control ODCLK2, composer, and TGEN lock_src
6096     if (eWindow == MAIN_WINDOW)
6097     {
6098         if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled) && (psXCInstPri->u32DeviceID != 1))
6099         {
6100             // for DS case, it would update MDE at DS cmd
6101             // for other case, if AP only call setwindow without setpaneltiming, need to update MDE here
6102             if(!MDrv_XC_Is_SupportSWDS(pInstance))
6103             {
6104                 static MS_BOOL bIsFhdToFsc = TRUE;
6105                 if (bIsFhdToFsc == MHal_FRC_IsFHDToFSC(pInstance, eWindow))
6106                 {
6107                     //commands move to mload
6108                     //MDrv_FRC_UpdateMDE(pInstance, gSrcInfo[MAIN_WINDOW].stDispWin);
6109                 }
6110                 else
6111                 {
6112                     MS_BOOL bMLoad = (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)?TRUE:FALSE;
6113                     if(bMLoad)
6114                     {
6115                         _MLOAD_ENTRY(pInstance);
6116                     }
6117 
6118                     MST_PANEL_INFO_t stFRCPanelInfo;
6119                     MDrv_FRC_PNLInfo_Transform(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo,&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc, &stFRCPanelInfo);
6120                     MDrv_FRC_Tx_SetTgen(pInstance, &stFRCPanelInfo);
6121 
6122                     MS_BOOL bLockFromIP = FALSE;
6123 
6124                     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled &&
6125                        (gSrcInfo[eWindow].bEnableFPLL && (gSrcInfo[MAIN_WINDOW].stCapWin.height < gSrcInfo[MAIN_WINDOW].u16InputVTotal)))
6126                     {
6127                         bLockFromIP = TRUE;
6128                     }
6129                     //for Maserati 120Hz
6130                     MS_U8 u8LPLL_Type =(MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
6131                     if(IsVBY1_16LANE(u8LPLL_Type))
6132                     {
6133                         // case 5: FSC + FRC
6134                         if (MHal_FRC_IsFHDToFSC(pInstance, eWindow))
6135                         {
6136                             // FHD case, ODCLK2 as ODCLK/4
6137                             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_4, bMLoad);
6138                         }
6139                         else
6140                         {
6141                             // 4K 50/60 case, ODLCK2 as ODCLK
6142                             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_1, bMLoad);
6143                         }
6144                     }
6145                     else
6146                     {
6147                         if (MHal_FRC_IsFHDToFSC(pInstance, eWindow))
6148                         {
6149                             // FHD case, ODCLK2 as ODCLK/4
6150                             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_4, bMLoad);
6151                         }
6152                         else if ((gSrcInfo[eWindow].u16InputVFreq < 330) && bLockFromIP)
6153                         {
6154                             // FRC enable, sync from IP case
6155                             // 4K 24/25/30 case, ODCLK2 as ODCLK/2 for power saving
6156                             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_2, bMLoad);
6157                         }
6158                         else
6159                         {
6160                             // 4K 50/60 case, ODLCK2 as ODCLK
6161                             MHal_FRC_Set_STGEN_ODCLK(pInstance, E_FRC_STGEN_ODCLK_1, bMLoad);
6162                         }
6163                     }
6164 
6165                     if (MHal_FRC_IsFHDToFSC(pInstance, MAIN_WINDOW))
6166                     {
6167                         if (bMLoad == TRUE)
6168                         {
6169                             MDrv_XC_MLoad_WriteCommand_NonXC(pInstance, 0x1423, 0x26, 0x1000, 0xFFFF);
6170                         }
6171                         else
6172                         {
6173                             MDrv_Write2ByteMask(REG_FSC_BK23_26, 0x1000, 0x1000);
6174                         }
6175                     }
6176                     else
6177                     {
6178                         if (bMLoad == TRUE)
6179                         {
6180                             MDrv_XC_MLoad_WriteCommand_NonXC(pInstance, 0x1423, 0x26, 0x0000, 0xFFFF);
6181                         }
6182                         else
6183                         {
6184                             MDrv_Write2ByteMask(REG_FSC_BK23_26, 0x0000, 0x1000);
6185                         }
6186                     }
6187 
6188                     bIsFhdToFsc = MHal_FRC_IsFHDToFSC(pInstance, eWindow);
6189 
6190                     MDrv_XC_MLoad_Fire(pInstance, TRUE);
6191 
6192                     if(bMLoad)
6193                     {
6194                         _MLOAD_RETURN(pInstance);
6195                     }
6196 
6197                 }
6198 
6199                 MDrv_FRC_Set_3D_QMap(pInstance, E_FRC_PNL_TYPE_2D, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_MODE_NONE); // load FRC 3D table
6200 
6201             }
6202         }
6203     }
6204 
6205 #endif
6206 
6207     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6208     Hal_SC_ControlMloadTrig(pInstance);
6209     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6210 
6211 #if (HW_DESIGN_4K2K_VER == 7) //Kano Patch
6212     //[FIXME]If DS case, Kano need to disable REG_SC_BK00_03_L [12]
6213     //but MDrv_XC_3D_LoadReg will enable REG_SC_BK00_03_L [12]
6214     //so we disable it here temporary
6215     if(MDrv_XC_GetDynamicScalingStatus(pInstance))
6216     {
6217         SC_W2BYTEMSK(0, REG_SC_BK00_03_L, 0x0000, 0x1000);
6218     }
6219 #endif
6220 
6221     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= SetWindow Done (Window : %u, src: %u) =============\n",eWindow, gSrcInfo[eWindow].enInputSourceType);
6222     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6223 
6224     _SETWINDOW_RETURN();
6225 
6226     if(g_bSWDSGenScenario)
6227     {
6228         g_bSWDSGenScenario = FALSE;
6229     }
6230 
6231 
6232 
6233     return bRet;
6234 }
6235 
MApi_XC_SetWindow(XC_SETWIN_INFO * pstXC_SetWin_Info,MS_U32 u32InitDataLen,SCALER_WIN eWindow)6236 MS_BOOL MApi_XC_SetWindow(XC_SETWIN_INFO *pstXC_SetWin_Info, MS_U32 u32InitDataLen, SCALER_WIN eWindow)
6237 {
6238     if (pu32XCInst == NULL
6239 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
6240         || pu32XCInst_1 == NULL
6241 #endif
6242         )
6243     {
6244         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
6245         return FALSE;
6246     }
6247 #if (defined (ANDROID))
6248     static XC_INITMISC tmp_Init_Misc;
6249     stXC_GET_MISC_STATUS XCArgs1;
6250     XCArgs1.pXC_Init_Misc = &tmp_Init_Misc;
6251     XCArgs1.eReturnValue = E_APIXC_RET_FAIL;
6252 
6253     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MISC_STATUS, (void*)&XCArgs1) != UTOPIA_STATUS_SUCCESS)
6254     {
6255         printf("Obtain XC engine fail\n");
6256         return E_APIXC_RET_FAIL;
6257     }
6258 
6259     if(!(tmp_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_IS_ANDROID))
6260     {
6261         tmp_Init_Misc.u32MISC_A |= E_XC_INIT_MISC_A_IS_ANDROID;
6262 
6263         stXC_INIT_MISC XCArgs2;
6264         XCArgs2.pXC_Init_Misc = &tmp_Init_Misc;
6265         XCArgs2.u32InitMiscDataLen = sizeof(XC_INITMISC);
6266         XCArgs2.eReturnValue = E_APIXC_RET_FAIL;
6267 
6268         if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
6269         {
6270             printf("Obtain XC engine fail\n");
6271             return E_APIXC_RET_FAIL;
6272         }
6273     }
6274 #else
6275     static XC_INITMISC tmp_Init_Misc;
6276     stXC_GET_MISC_STATUS XCArgs1;
6277     XCArgs1.pXC_Init_Misc = &tmp_Init_Misc;
6278     XCArgs1.eReturnValue = E_APIXC_RET_FAIL;
6279 
6280     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MISC_STATUS, (void*)&XCArgs1) != UTOPIA_STATUS_SUCCESS)
6281     {
6282         printf("Obtain XC engine fail\n");
6283         return E_APIXC_RET_FAIL;
6284     }
6285 
6286     if(tmp_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_IS_ANDROID)
6287     {
6288         tmp_Init_Misc.u32MISC_A = tmp_Init_Misc.u32MISC_A & (~E_XC_INIT_MISC_A_IS_ANDROID);
6289         stXC_INIT_MISC XCArgs2;
6290         XCArgs2.pXC_Init_Misc = &tmp_Init_Misc;
6291         XCArgs2.u32InitMiscDataLen = sizeof(XC_INITMISC);
6292         XCArgs2.eReturnValue = E_APIXC_RET_FAIL;
6293 
6294 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
6295         if(eWindow == SUB_WINDOW)
6296         {
6297             if(UtopiaIoctl(pu32XCInst_1, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
6298             {
6299                 printf("Obtain XC engine fail\n");
6300                 return E_APIXC_RET_FAIL;
6301             }
6302         }
6303         else
6304         {
6305             if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
6306             {
6307                 printf("Obtain XC engine fail\n");
6308                 return E_APIXC_RET_FAIL;
6309             }
6310         }
6311 #else
6312         if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
6313         {
6314             printf("Obtain XC engine fail\n");
6315             return E_APIXC_RET_FAIL;
6316         }
6317 #endif
6318 
6319     }
6320 #endif
6321     stXC_SET_WINDOW XCArgs;
6322     XCArgs.pstXC_SetWin_Info = pstXC_SetWin_Info;
6323     XCArgs.u32InitDataLen = u32InitDataLen;
6324     XCArgs.eWindow = eWindow;
6325     XCArgs.bReturnValue = FALSE;
6326 
6327     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_WINDOW, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
6328     {
6329         printf("Obtain XC engine fail\n");
6330         return FALSE;
6331     }
6332     else
6333     {
6334         return XCArgs.bReturnValue;
6335     }
6336 }
6337 
6338 #ifndef DISABLE_3D_FUNCTION
_MDrv_XC_3D_LoadReg(void * pInstance,E_XC_3D_INPUT_MODE eInputMode,E_XC_3D_OUTPUT_MODE eOutputMode,XC_InternalStatus * pSrcInfo,SCALER_WIN eWindow)6339 static MS_BOOL _MDrv_XC_3D_LoadReg(void *pInstance, E_XC_3D_INPUT_MODE eInputMode,
6340                            E_XC_3D_OUTPUT_MODE eOutputMode,
6341                            XC_InternalStatus *pSrcInfo,
6342                            SCALER_WIN eWindow)
6343 {
6344     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6345     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6346     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6347     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6348     if (eWindow == MAIN_WINDOW)
6349     {
6350         memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg, &pXCResourcePrivate->stdrvXC_MVideo_Context.stMainDBreg, sizeof(SC_SWDB_INFO));
6351     }
6352     else
6353     {
6354         memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg, &pXCResourcePrivate->stdrvXC_MVideo_Context.stSubDBreg, sizeof(SC_SWDB_INFO));
6355     }
6356     return MDrv_XC_3D_LoadReg(pInstance, eInputMode, eOutputMode, pSrcInfo, eWindow);
6357 
6358 }
6359 #endif
6360 
MApi_XC_SetDualWindow_U2(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info_Main,XC_SETWIN_INFO * pstXC_SetWin_Info_Sub)6361 MS_BOOL MApi_XC_SetDualWindow_U2(void* pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info_Main, XC_SETWIN_INFO *pstXC_SetWin_Info_Sub)
6362 {
6363     MS_BOOL bRet = FALSE;
6364     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6365     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6366     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6367 
6368     _SETWINDOW_ENTRY();
6369 
6370     if (_MApi_XC_SetWindow(pInstance, pstXC_SetWin_Info_Main, sizeof(XC_SETWIN_INFO), TRUE, MAIN_WINDOW) == FALSE)
6371     {
6372         goto SETWINDOW_EXIT;
6373     }
6374 
6375     if (_MApi_XC_SetWindow(pInstance, pstXC_SetWin_Info_Sub, sizeof(XC_SETWIN_INFO), TRUE, SUB_WINDOW) == FALSE)
6376     {
6377         goto SETWINDOW_EXIT;
6378     }
6379 #ifndef DISABLE_3D_FUNCTION
6380     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6381     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6382     _MDrv_XC_3D_LoadReg(pInstance, MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW), MDrv_XC_Get_3D_Output_Mode(pInstance), &gSrcInfo[MAIN_WINDOW], MAIN_WINDOW);
6383     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6384 #endif
6385     bRet = TRUE;
6386     _SETWINDOW_RETURN();
6387 
6388     //all return should come here, because this code will enable opm write limit addr protect
6389 SETWINDOW_EXIT:
6390     {
6391     #if (ENABLE_OPM_WRITE_SUPPORTED)
6392         MS_PHY u32OPWLimitBase = 0x00;
6393         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6394         u32OPWLimitBase = ((MDrv_XC_GetIPMBase(pInstance, 0, MAIN_WINDOW)*BYTE_PER_WORD + MDrv_XC_GetDNRBufSize(pInstance, MAIN_WINDOW)) / BYTE_PER_WORD - 1) ;
6395         _XC_ENTRY(pInstance);
6396         MDrv_SC_set_opm_write_limit(pInstance, TRUE, 0 , u32OPWLimitBase , MAIN_WINDOW);
6397         _XC_RETURN(pInstance);
6398 #ifdef UFO_XC_SUPPORT_DUAL_MIU
6399         _XC_ENTRY(pInstance);
6400         if (IsEnableDualMode(MAIN_WINDOW))
6401         {
6402             u32OPWLimitBase = ((MDrv_XC_GetDualIPMBase(pInstance, 0, MAIN_WINDOW)*BYTE_PER_WORD + MDrv_XC_GetDualDNRBufSize(pInstance, MAIN_WINDOW)) / BYTE_PER_WORD - 1) ;
6403             MDrv_SC_set_dual_opm_write_limit(pInstance, TRUE, 0 , u32OPWLimitBase , MAIN_WINDOW);
6404         }
6405         _XC_RETURN(pInstance);
6406 #endif
6407         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6408     #endif
6409     }
6410 
6411     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= Set Dual Window Done =============\n");
6412     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6413 
6414     if (bRet == FALSE)
6415     {
6416         _SETWINDOW_RETURN();
6417     }
6418     return bRet;
6419 }
6420 
MApi_XC_SetDualWindow(XC_SETWIN_INFO * pstXC_SetWin_Info_Main,XC_SETWIN_INFO * pstXC_SetWin_Info_Sub)6421 MS_BOOL MApi_XC_SetDualWindow(XC_SETWIN_INFO *pstXC_SetWin_Info_Main, XC_SETWIN_INFO *pstXC_SetWin_Info_Sub)
6422 {
6423     if (pu32XCInst == NULL)
6424     {
6425         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
6426         return FALSE;
6427     }
6428 
6429     stXC_SET_DUALWINDOW XCArgs;
6430     XCArgs.pstXC_SetWin_Info_Main = pstXC_SetWin_Info_Main;
6431     XCArgs.pstXC_SetWin_Info_Sub = pstXC_SetWin_Info_Sub;
6432     XCArgs.bReturnValue = FALSE;
6433 
6434     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_DUALWINDOW, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
6435     {
6436         printf("Obtain XC engine fail\n");
6437         return FALSE;
6438     }
6439     else
6440     {
6441         return XCArgs.bReturnValue;
6442     }
6443 }
6444 
6445 #if FRC_INSIDE
Mapi_XC_FRC_Set_User_MemoryFMT(void * pInstance,MS_U8 u8Mode,MS_BOOL bEnable)6446 void Mapi_XC_FRC_Set_User_MemoryFMT(void *pInstance, MS_U8 u8Mode, MS_BOOL bEnable)
6447 {
6448     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6449     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6450     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6451     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6452     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6453     pXCResourcePrivate->stdrvXC_MVideo.bEnableUserMode = bEnable;
6454     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = u8Mode;
6455     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6456 }
6457 
Mapi_XC_FRC_Get_MemoryFMT(void * pInstance)6458 MS_U8 Mapi_XC_FRC_Get_MemoryFMT(void *pInstance) //NO_USE
6459 {
6460     MS_U8 u8Val = 0;
6461     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6462     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6463     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6464     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6465     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6466     u8Val = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode;
6467     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6468 
6469     return u8Val;
6470 }
6471 
Mapi_XC_FRC_Set_MemoryFMT(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType)6472 void Mapi_XC_FRC_Set_MemoryFMT(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
6473                                 E_XC_3D_OUTPUT_MODE e3dOutputMode,
6474                                 E_XC_3D_PANEL_TYPE e3dPanelType)
6475 {
6476     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6477     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6478     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6479     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6480     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6481     if(pXCResourcePrivate->stdrvXC_MVideo.bEnableUserMode == FALSE)
6482     {
6483         // RGB and DVI
6484         if(0) //(IsSrcTypeVga(enInputSourceType) ||
6485            //(IsSrcTypeHDMI(enInputSourceType)&(!g_HdmiPollingStatus.bIsHDMIMode)))
6486         {
6487             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "### is RGB Space\n");
6488             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_RGB_10_SPECIAL;
6489         }
6490         else
6491         {
6492             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
6493             {
6494                 if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6495                 {
6496                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### E_XC_3D_OUTPUT_FRAME_ALTERNATIVE\n");
6497                     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_960x1080)||
6498                        (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1280x720))
6499                     {
6500                         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### is YUV Space, 960x1080\n");
6501                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_YUV_10_SPECIAL;
6502                     }
6503                     //else if((g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1920x1080)||
6504                     //   (g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1920x540))
6505                     else
6506                     {
6507                         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### is YC Space, 1920x1080/1920x540\n");
6508                         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_YC_10_SPECIAL;
6509                     }
6510                 }
6511                 else if(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
6512                 {
6513                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF\n");
6514                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### is YUV Space, SBS 960x1080\n");
6515                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_YUV_10_SPECIAL;
6516                 }
6517                 else
6518                 {
6519                     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### is YC Space, others\n");
6520                     pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_YC_10_SPECIAL;
6521                 }
6522             }
6523             else
6524             {
6525                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u8IpMode = FRC_IP_MEM_IP_YC_10_SPECIAL;
6526                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"### is YC Space, bypass\n");
6527             }
6528         }
6529     }
6530     else
6531     {
6532         printf("\n\n@@Use User define for debug\n\n");
6533     }
6534 #if 1
6535     if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6536         &&(e3dInputMode == E_XC_3D_INPUT_FRAME_PACKING)
6537         &&(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_1280x720))
6538     {
6539         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16PanelWidth = 1280;
6540         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16PanelHeigh= 720;
6541     }
6542     else
6543     {
6544         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16PanelWidth = 1920;
6545         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
6546         {
6547             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16PanelHeigh = 540;
6548         }
6549         else
6550         {
6551             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16PanelHeigh = 1080;
6552         }
6553     }
6554 #endif
6555     MDrv_FRC_SetMemFormat(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo);
6556 
6557     if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
6558     {
6559         if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out == E_XC_3D_OUTPUT_FI_960x1080)&&
6560            (e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE))
6561         {
6562             pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u16FB_YcountLinePitch /= 2;
6563         }
6564         MDrv_FRC_OPM_SetBaseOfset(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo, e3dOutputMode);
6565     }
6566     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6567 }
6568 
6569 //-------------------------------------------------------------------------------------------------
6570 /// set 3D convert format type
6571 /// @param  e3dInputMode                \b IN: the input format
6572 /// @param  e3dOutputMode               \b IN: the format we want to convert to
6573 /// @param  e3dPanelType                \b IN: the panel type.
6574 //-------------------------------------------------------------------------------------------------
MApi_XC_FRC_Set_3D_Mode(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType)6575 void MApi_XC_FRC_Set_3D_Mode(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
6576                                        E_XC_3D_OUTPUT_MODE e3dOutputMode,
6577                                        E_XC_3D_PANEL_TYPE e3dPanelType)
6578 {
6579 
6580 
6581     MS_U8 u8FRC_Pnl_type = E_FRC_PNL_TYPE_PASSIVE;
6582     MS_U8 u83D_FI_out = E_XC_3D_OUTPUT_FI_MODE_NONE;
6583     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6584     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6585     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6586     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6587     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6588 
6589     if (e3dPanelType == E_XC_3D_PANEL_SHUTTER)
6590     {
6591         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_240HZ)
6592         {
6593             u8FRC_Pnl_type = E_FRC_PANEL_3D_TYPE_ACTIVE_240_1920_540;
6594         }
6595         else
6596         {
6597             u8FRC_Pnl_type = E_FRC_PNL_TYPE_ACTIVE;
6598         }
6599     }
6600     else if(e3dPanelType == E_XC_3D_PANEL_PELLICLE)
6601     {
6602         u8FRC_Pnl_type = E_FRC_PNL_TYPE_PASSIVE;
6603     }
6604     else
6605     {
6606         u8FRC_Pnl_type = E_FRC_PNL_TYPE_2D;
6607     }
6608 
6609     u83D_FI_out = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.u83D_FI_out;
6610 
6611     switch(e3dInputMode)
6612     {
6613         case E_XC_3D_INPUT_MODE_NONE:
6614         case E_XC_3D_INPUT_NORMAL_2D_HW:
6615             MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, e3dInputMode, e3dOutputMode, u83D_FI_out);
6616         break;
6617 
6618         default:
6619         case E_XC_3D_INPUT_FRAME_PACKING:
6620             if(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
6621             {
6622                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_FRAME_PACKING, E_XC_3D_OUTPUT_TOP_BOTTOM, u83D_FI_out);
6623             }
6624             else if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6625             {
6626                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_FRAME_PACKING, E_XC_3D_OUTPUT_FRAME_ALTERNATIVE, u83D_FI_out);
6627             }
6628             else if(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
6629             {
6630                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_FRAME_PACKING, E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF, u83D_FI_out);
6631             }
6632             else if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
6633             {
6634                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_1920x1080);
6635             }
6636             else
6637             {
6638                 printf("\n##[%s]1. Please check the 3D input and out mode\n\n", __FUNCTION__);
6639             }
6640         break;
6641         case E_XC_3D_INPUT_SIDE_BY_SIDE_HALF:
6642             if(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
6643             {
6644                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_SIDE_BY_SIDE_HALF, E_XC_3D_OUTPUT_TOP_BOTTOM, u83D_FI_out);
6645 
6646             }
6647             else if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6648             {
6649                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_SIDE_BY_SIDE_HALF, E_XC_3D_OUTPUT_FRAME_ALTERNATIVE, u83D_FI_out);
6650 
6651             }
6652             else if(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
6653             {
6654                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_SIDE_BY_SIDE_HALF, E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF, u83D_FI_out);
6655             }
6656             else if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
6657             {
6658                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_1920x1080);
6659             }
6660             else
6661             {
6662                 printf("\n##[%s]2. Please check the 3D input and out mode\n\n", __FUNCTION__);
6663             }
6664 
6665         break;
6666         case E_XC_3D_INPUT_SIDE_BY_SIDE_FULL:
6667             if(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
6668             {
6669                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_SIDE_BY_SIDE_FULL, E_XC_3D_OUTPUT_TOP_BOTTOM, u83D_FI_out);
6670 
6671             }
6672             else if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6673             {
6674                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_SIDE_BY_SIDE_FULL, E_XC_3D_OUTPUT_FRAME_ALTERNATIVE, u83D_FI_out);
6675             }
6676             else if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
6677             {
6678                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_1920x1080);
6679             }
6680             else
6681             {
6682                 printf("\n##[%s]2. Please check the 3D input and out mode\n\n", __FUNCTION__);
6683             }
6684         break;
6685         case E_XC_3D_INPUT_TOP_BOTTOM:
6686             if(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
6687             {
6688                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_TOP_BOTTOM, E_XC_3D_OUTPUT_TOP_BOTTOM, u83D_FI_out);
6689             }
6690             else if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6691             {
6692                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_TOP_BOTTOM, E_XC_3D_OUTPUT_FRAME_ALTERNATIVE, u83D_FI_out);
6693 
6694             }
6695             else if(e3dOutputMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
6696             {
6697                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_OUTPUT_TOP_BOTTOM, E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF, u83D_FI_out);
6698 
6699             }
6700             else if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
6701             {
6702                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_1920x1080);
6703             }
6704             else
6705             {
6706                 printf("\n##[%s]3. Please check the 3D input and out mode\n\n", __FUNCTION__);
6707             }
6708         break;
6709         case E_XC_3D_INPUT_FRAME_ALTERNATIVE:
6710             if(e3dOutputMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
6711             {
6712                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_FRAME_ALTERNATIVE, E_XC_3D_OUTPUT_TOP_BOTTOM, u83D_FI_out);
6713             }
6714             else if(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
6715             {
6716                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_FRAME_ALTERNATIVE, E_XC_3D_OUTPUT_FRAME_ALTERNATIVE, u83D_FI_out);
6717             }
6718             else if((e3dOutputMode == E_XC_3D_OUTPUT_FRAME_L)||(e3dOutputMode == E_XC_3D_OUTPUT_FRAME_R))
6719             {
6720                 MDrv_FRC_Set_3D_QMap(pInstance, u8FRC_Pnl_type, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_1920x1080);
6721             }
6722             else
6723             {
6724                 printf("\n##[%s]1. Please check the 3D input and out mode\n\n", __FUNCTION__);
6725             }
6726         break;
6727 
6728 
6729     }
6730 
6731     switch(e3dOutputMode)
6732     {
6733         //for 2D to 3D use
6734 
6735         // ParaCnt=4, P0 = 2D to 3D ConversionMode(0=Disable, 1=Enable)
6736         //                  P1 = 3D Depth Gain(0~31)
6737         //                  P2 = 3D Depth Offset(0~127)
6738         //                  P3 = Artificial Gain(0~15)
6739 
6740         case E_XC_3D_OUTPUT_CHECKBOARD_HW:
6741         case E_XC_3D_OUTPUT_LINE_ALTERNATIVE_HW:
6742         case E_XC_3D_OUTPUT_PIXEL_ALTERNATIVE_HW:
6743         case E_XC_3D_OUTPUT_FRAME_L_HW:
6744         case E_XC_3D_OUTPUT_FRAME_R_HW:
6745             if(!Hal_XC_FRC_R2_Set_2DTo3DMode(1, 0x13, 0x69, 0x0E))
6746             {
6747                 printf("Enable 2DTo3D Failed\n");
6748             }
6749         break;
6750 
6751         default:
6752             if(!Hal_XC_FRC_R2_Set_2DTo3DMode(0, 0x13, 0x69, 0x8))
6753             {
6754                 printf("Disable 2DTo3D Failed\n");
6755             }
6756         break;
6757     }
6758     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6759 }
6760 #endif
6761 extern MS_U16 _MDrv_SC_GetOutputVPeriod(void *pInstance);
MApi_XC_FRC_BypassMFC_U2(void * pInstance,MS_BOOL bEnable)6762 MS_BOOL MApi_XC_FRC_BypassMFC_U2(void* pInstance, MS_BOOL bEnable)
6763 {
6764 #if FRC_INSIDE
6765     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6766 
6767     MS_U8 u8Mode = FRC_IP_MEM_IP_RGB_10_SPECIAL;
6768     E_XC_3D_INPUT_MODE e3dInputMode = E_XC_3D_INPUT_MODE_NONE;
6769     E_XC_3D_OUTPUT_MODE e3dOutputMode = E_XC_3D_OUTPUT_MODE_NONE;
6770 
6771     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6772     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6773 
6774     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6775     E_XC_3D_PANEL_TYPE e3dPanelType = MDrv_XC_Get_3D_Panel_Type(pInstance);
6776     MS_U16 u16DelayCount = 0;
6777 
6778     FRC_R2_CMD_PARAMETER_t tFRC_R2_Para;
6779 
6780     memset(&tFRC_R2_Para, 0, sizeof(FRC_R2_CMD_PARAMETER_t));
6781 
6782     ///Current spec doesn't have bypass MFC in 3D mode, this is only for PC RGB bypass mode
6783     if((e3dInputMode != MDrv_XC_Get_3D_Input_Mode(pInstance, MAIN_WINDOW))||(e3dOutputMode != MDrv_XC_Get_3D_Output_Mode(pInstance)))
6784     {
6785         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6786         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6787         return FALSE;
6788     }
6789     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6790 
6791     // for Agate, Freeze memory
6792     W2BYTEMSK(L_FRC_SC134(0x07), BIT(0), BIT(0));
6793 
6794     if(bEnable)
6795     {
6796         printf("@@@ MFC Bypass Enable\n");
6797         printf("@@@1,Set MFC CMD \n");
6798 
6799         tFRC_R2_Para.p1=0x0F;
6800         tFRC_R2_Para.p2=0;
6801         tFRC_R2_Para.p3=0;
6802 
6803         MDrv_XC_SendCmdToFRC(pInstance, 0x20, 3, tFRC_R2_Para );
6804         MDrv_Write2ByteMask(0x3020C0, 0x00, BIT(0));  // IPM CSC oFF
6805         // for Agate
6806         MDrv_Write2ByteMask(0x302660, 0x00, BIT(8));  // data flow don't go through the MFC section
6807         MDrv_Write2ByteMask(0x302C80, 0x00, BIT(0)); // MFC Stage disable
6808         MDrv_Write2ByteMask(0x30290E, 0x00, 0xFFFF); // MFC disable
6809         W2BYTEMSK(L_FRC_SC134(0x07), BIT(1), BIT(1));
6810         //Disable 6R mode
6811         W2BYTEMSK(L_FRC_SC134(0x19), 0x00, BIT(8));
6812 
6813 
6814         MDrv_Write2ByteMask(0x303002, 0x00, BIT(3));   // OP2 CSC oFF
6815         u16DelayCount = 7;
6816         u8Mode = FRC_IP_MEM_IP_RGB_10_SPECIAL;
6817     }
6818     else
6819     {
6820         printf("@@@ MFC Bypass Disable\n");
6821         printf("@@@1,Set MFC CMD \n");
6822 
6823         tFRC_R2_Para.p1=0x02;
6824         tFRC_R2_Para.p2=0;
6825         tFRC_R2_Para.p3=0;
6826 
6827         MDrv_XC_SendCmdToFRC(pInstance, 0x20, 3, tFRC_R2_Para );
6828 
6829         MDrv_Write2ByteMask(0x3020C0, BIT(0), BIT(0));
6830         // for Agate
6831         MDrv_Write2ByteMask(0x302660, BIT(8), BIT(8));
6832         MDrv_Write2ByteMask(0x302C80, BIT(0), BIT(0));
6833         MDrv_Write2ByteMask(0x30290E, 0x1D2F, 0xFFFF);
6834         W2BYTEMSK(L_FRC_SC134(0x07), 0, BIT(1));
6835         //Enable 6R mode
6836         W2BYTEMSK(L_FRC_SC134(0x19), BIT(8), BIT(8));
6837 
6838         MDrv_Write2ByteMask(0x303002, BIT(3), BIT(3));
6839         u16DelayCount = 10;
6840         u8Mode = FRC_IP_MEM_IP_YUV_10_SPECIAL;
6841     }
6842     printf("@@@2,Load MFC table\n");
6843     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6844     Mapi_XC_FRC_Set_User_MemoryFMT(pInstance, u8Mode, bEnable);
6845     MDrv_XC_FRC_SetWindow(pInstance, e3dInputMode, e3dOutputMode, e3dPanelType);
6846     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6847     // for Agate, need to wait the memory write finish
6848     u16DelayCount *= 20;//_MDrv_SC_GetOutputVPeriod(); //get delay time
6849     printf("Enable Delay=%u\n", u16DelayCount);
6850     MsOS_DelayTask(u16DelayCount);
6851 
6852     // for Agate, un Freeze memory
6853     W2BYTEMSK(L_FRC_SC134(0x07), 0x00, BIT(0));
6854 
6855     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6856     return TRUE;
6857 #else
6858     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6859     return FALSE;
6860 #endif
6861 
6862 }
6863 
MApi_XC_FRC_BypassMFC(MS_BOOL bEnable)6864 MS_BOOL MApi_XC_FRC_BypassMFC(MS_BOOL bEnable)
6865 {
6866     if (pu32XCInst == NULL)
6867     {
6868         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
6869         return FALSE;
6870     }
6871 
6872     stXC_FRC_BYPASS XCArgs;
6873     XCArgs.bEnable = bEnable;
6874     XCArgs.bReturnValue = FALSE;
6875 
6876     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_FRC_BYPASS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
6877     {
6878         printf("Obtain XC engine fail\n");
6879         return FALSE;
6880     }
6881     else
6882     {
6883         return XCArgs.bReturnValue;
6884     }
6885 }
6886 
MApi_XC_FRC_Mute_U2(void * pInstance,MS_BOOL bEnable)6887 void MApi_XC_FRC_Mute_U2(void* pInstance, MS_BOOL bEnable)
6888 {
6889     MDrv_FRC_Mute(pInstance, bEnable);
6890 }
6891 
MApi_XC_FRC_Mute(MS_BOOL bEnable)6892 void MApi_XC_FRC_Mute(MS_BOOL bEnable)
6893 {
6894     if (pu32XCInst == NULL)
6895     {
6896         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
6897         return;
6898     }
6899 
6900     stXC_FRC_MUTE XCArgs;
6901     XCArgs.bEnable = bEnable;
6902 
6903     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_FRC_MUTE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
6904     {
6905         printf("Obtain XC engine fail\n");
6906         return;
6907     }
6908     else
6909     {
6910         return;
6911     }
6912 }
6913 
MDrv_XC_FRC_SetWindow(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType)6914 void MDrv_XC_FRC_SetWindow(void *pInstance, E_XC_3D_INPUT_MODE e3dInputMode,
6915                            E_XC_3D_OUTPUT_MODE e3dOutputMode,
6916                            E_XC_3D_PANEL_TYPE e3dPanelType)
6917 {
6918 #if FRC_INSIDE
6919     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6920     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6921     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6922     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6923     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
6924 
6925     if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC &&
6926         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultHTotal> 3000) &&
6927         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVTotal> 2000) &&
6928         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500) &&  // 4K2K panel
6929         (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_FRC_INSIDE_4K1K_120HZ) &&
6930         (E_XC_3D_OUTPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Output_Mode(pInstance)))
6931     {
6932         // For FRC inside chip, ex.Einstein/Napoli
6933         // 4K1K FA output case, FRC only can handle TB in to FA out
6934         // FRC input is TB, output is FA
6935         e3dInputMode = E_XC_3D_INPUT_TOP_BOTTOM;
6936         e3dOutputMode = E_XC_3D_OUTPUT_FRAME_ALTERNATIVE;
6937     }
6938 
6939     Mapi_XC_FRC_Set_MemoryFMT(pInstance, e3dInputMode, e3dOutputMode, e3dPanelType);
6940     MApi_XC_FRC_Set_3D_Mode(pInstance, e3dInputMode, e3dOutputMode, e3dPanelType);
6941     if( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width == 3840)
6942         && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height == 2160) )
6943     {
6944         printf("@@@ %s: 4k2k patch\n", __FUNCTION__);
6945         //FRC IPM/OPM
6946         MDrv_FRC_IPM_SetOffset(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
6947         MDrv_FRC_IPM_SetFetchNum(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
6948         MDrv_FRC_OPM_SetOffset(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
6949         MDrv_FRC_OPM_SetFetchNum(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
6950         //FRC OP HSU/VSU
6951         MDrv_FRC_HSU_SetScalingSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width,
6952                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width);
6953         MDrv_FRC_VSU_SetScalingSize(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height,
6954                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
6955         //force RGB 444
6956         MDrv_FRC_CSC_SelectPath(pInstance, E_FRC_COLOR_PATH_RGB_444);
6957     }
6958     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
6959 #endif
6960 }
6961 
MApi_XC_FRC_SetWindow_U2(void * pInstance,E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType)6962 void MApi_XC_FRC_SetWindow_U2(void* pInstance,
6963                              E_XC_3D_INPUT_MODE e3dInputMode,
6964                              E_XC_3D_OUTPUT_MODE e3dOutputMode,
6965                              E_XC_3D_PANEL_TYPE e3dPanelType)
6966 {
6967     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6968     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6969     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
6970     MDrv_XC_FRC_SetWindow(pInstance, e3dInputMode, e3dOutputMode, e3dPanelType);
6971     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
6972 }
6973 
MApi_XC_FRC_SetWindow(E_XC_3D_INPUT_MODE e3dInputMode,E_XC_3D_OUTPUT_MODE e3dOutputMode,E_XC_3D_PANEL_TYPE e3dPanelType)6974 void MApi_XC_FRC_SetWindow(E_XC_3D_INPUT_MODE e3dInputMode,
6975                            E_XC_3D_OUTPUT_MODE e3dOutputMode,
6976                            E_XC_3D_PANEL_TYPE e3dPanelType)
6977 {
6978     if (pu32XCInst == NULL)
6979     {
6980         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
6981         return;
6982     }
6983 
6984     stXC_SET_FRC_WINDOW XCArgs;
6985     XCArgs.e3dInputMode = e3dInputMode;
6986     XCArgs.e3dOutputMode = e3dOutputMode;
6987     XCArgs.e3dPanelType = e3dPanelType;
6988 
6989     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FRC_WINDOW, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
6990     {
6991         printf("Obtain XC engine fail\n");
6992         return;
6993     }
6994     else
6995     {
6996         return;
6997     }
6998 }
6999 //-------------------------------------------------------------------------------------------------
7000 /// Set report window
7001 /// @param  bEnable        \b IN: enable or disable report window
7002 /// @param  Window         \b IN: the window position and size
7003 /// @param  u8Color        \b IN: report window's color
7004 //-------------------------------------------------------------------------------------------------
MApi_XC_SetRepWindow_U2(void * pInstance,MS_BOOL bEnable,MS_WINDOW_TYPE Window,MS_U8 u8Color)7005 void MApi_XC_SetRepWindow_U2(void* pInstance, MS_BOOL bEnable,MS_WINDOW_TYPE Window,MS_U8 u8Color)
7006 {
7007     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7008     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7009     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7010     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7011     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7012     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7013     _XC_ENTRY(pInstance);
7014     MDrv_SC_rep_window(pInstance,bEnable,Window,u8Color);
7015     memcpy(&pXCResourcePrivate->stdrvXC_MVideo_Context.g_RepWindow, &Window, sizeof(MS_WINDOW_TYPE));
7016     _XC_RETURN(pInstance);
7017     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7018     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7019 }
7020 
MApi_XC_SetRepWindow(MS_BOOL bEnable,MS_WINDOW_TYPE Window,MS_U8 u8Color)7021 void MApi_XC_SetRepWindow(MS_BOOL bEnable,MS_WINDOW_TYPE Window,MS_U8 u8Color)
7022 {
7023     if (pu32XCInst == NULL)
7024     {
7025         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7026         return;
7027     }
7028 
7029     stXC_SET_REPORT_WINDOW XCArgs;
7030     XCArgs.bEnable = bEnable;
7031     XCArgs.Window = Window;
7032     XCArgs.u8Color = u8Color;
7033 
7034     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_REPORT_WINDOW, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7035     {
7036         printf("Obtain XC engine fail\n");
7037         return;
7038     }
7039     else
7040     {
7041         return;
7042     }
7043 }
7044 
7045 //-------------------------------------------------------------------------------------------------
7046 /// update display window registers with input window
7047 /// @param  eWindow                          \b IN: Main or sub window
7048 /// @param  pdspwin                          \b IN: window info that will be setted to registers
7049 //-------------------------------------------------------------------------------------------------
MApi_XC_SetDispWinToReg_U2(void * pInstance,MS_WINDOW_TYPE * pstDspwin,SCALER_WIN eWindow)7050 void    MApi_XC_SetDispWinToReg_U2(void* pInstance, MS_WINDOW_TYPE *pstDspwin, SCALER_WIN eWindow)
7051 {
7052     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7053     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7054     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7055     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7056 
7057     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7058     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7059     _XC_ENTRY(pInstance);
7060     MDrv_XC_set_dispwin_to_reg(pInstance, eWindow, pstDspwin);
7061     memcpy(&gSrcInfo[eWindow].stDispWin, pstDspwin, sizeof(MS_WINDOW_TYPE));
7062 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
7063     if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled) && (psXCInstPri->u32DeviceID != 1))
7064     {
7065         MDrv_FRC_UpdateMDE(pInstance, gSrcInfo[eWindow].stDispWin);
7066     }
7067 #endif
7068     _XC_RETURN(pInstance);
7069     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7070     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7071 }
7072 
MApi_XC_SetDispWinToReg(MS_WINDOW_TYPE * pstDspwin,SCALER_WIN eWindow)7073 void    MApi_XC_SetDispWinToReg(MS_WINDOW_TYPE *pstDspwin, SCALER_WIN eWindow)
7074 {
7075     if (pu32XCInst == NULL)
7076     {
7077         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7078         return;
7079     }
7080 
7081     stXC_SET_DISPLAY_WIN_TO_REG XCArgs;
7082     XCArgs.pstDspwin = pstDspwin;
7083     XCArgs.eWindow = eWindow;
7084 
7085     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_DISPLAY_WIN_TO_REG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7086     {
7087         printf("Obtain XC engine fail\n");
7088         return;
7089     }
7090     else
7091     {
7092         return;
7093     }
7094 }
7095 
7096 //-------------------------------------------------------------------------------------------------
7097 /// get current display window registers setting
7098 /// @param  eWindow                          \b IN : Main or sub window
7099 /// @param  pdspwin                          \b OUT: Pointer for ouput disp window register
7100 //-------------------------------------------------------------------------------------------------
MApi_XC_GetDispWinFromReg_U2(void * pInstance,MS_WINDOW_TYPE * pstDspwin,SCALER_WIN eWindow)7101 void    MApi_XC_GetDispWinFromReg_U2(void* pInstance, MS_WINDOW_TYPE *pstDspwin, SCALER_WIN eWindow)
7102 {
7103     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7104 
7105     _XC_ENTRY(pInstance);
7106     MDrv_XC_get_dispwin_from_reg(pInstance, eWindow, pstDspwin);
7107     _XC_RETURN(pInstance);
7108     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7109 }
7110 
MApi_XC_GetDispWinFromReg(MS_WINDOW_TYPE * pstDspwin,SCALER_WIN eWindow)7111 void    MApi_XC_GetDispWinFromReg(MS_WINDOW_TYPE *pstDspwin, SCALER_WIN eWindow)
7112 {
7113     if (pu32XCInst == NULL)
7114     {
7115         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7116         return;
7117     }
7118     static MS_WINDOW_TYPE tmp;
7119     memcpy(&tmp,pstDspwin,sizeof(MS_WINDOW_TYPE));
7120     stXC_GET_DISPLAY_WIN_FROM_REG XCArgs;
7121     XCArgs.pstDspwin = &tmp;
7122     XCArgs.eWindow = eWindow;
7123 
7124     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_DISPLAY_WIN_FROM_REG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7125     {
7126         printf("Obtain XC engine fail\n");
7127         return;
7128     }
7129     else
7130     {
7131         memcpy(pstDspwin,&tmp,sizeof(MS_WINDOW_TYPE));
7132         return;
7133     }
7134 }
7135 
7136 /// MUX API
7137 ///////////////////////////////////////////////////
7138 
7139 /**
7140  * InputSource Mux is a controller which handles all of the video path.
7141  * Before using video source, user have to create a data path between source and sink.
7142  * For example, DTV -> MainWindow or DTV -> SubWindow.
7143  */
7144 
7145 /////////////////////////////////////////
7146 // Configuration
7147 /////////////////////////////////////////
7148 
7149 
7150 /********************************************************************************/
7151 /*                 Static Variable and Functions (Private)                      */
7152 /********************************************************************************/
7153 
7154 /********************************************************************************/
7155 /*                 Functions                                                    */
7156 /********************************************************************************/
7157 
7158 //////////////////////////////////////
7159 //    Data Query Functions
7160 //////////////////////////////////////
MApi_XC_Mux_GetPortMappingMatrix_U2(void * pInstance,XC_MUX_INPUTSRCTABLE * mapping_tab,MS_U32 length)7161 void MApi_XC_Mux_GetPortMappingMatrix_U2(void *pInstance,XC_MUX_INPUTSRCTABLE* mapping_tab,MS_U32 length)
7162 {
7163     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7164     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7165     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7166     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7167     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7168     memcpy(pXCResourcePrivate->stdrvXC_MVideo.mapping_tab,mapping_tab,length);
7169     pXCResourcePrivate->stdrvXC_MVideo.matrix_length = (length / sizeof(XC_MUX_INPUTSRCTABLE));
7170     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7171 }
MApi_XC_Mux_GetPortMappingMatrix(XC_MUX_INPUTSRCTABLE mapping_tab[50],MS_U32 length)7172 void MApi_XC_Mux_GetPortMappingMatrix(XC_MUX_INPUTSRCTABLE mapping_tab[50],MS_U32 length)
7173 {
7174     if (pu32XCInst == NULL)
7175     {
7176         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
7177         {
7178             printf("UtopiaOpen XC failed\n");
7179             return;
7180         }
7181     }
7182 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
7183      if (pu32XCInst_1 == NULL)
7184      {
7185         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
7186         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
7187 
7188         stXCInstantAttribute.u32DeviceID = 1;
7189         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
7190         {
7191             printf("UtopiaOpen XC failed\n");
7192             return ;
7193         }
7194       }
7195 #endif
7196 
7197     stXC_GET_MUX_MAPPINGTAB XCArgs;
7198     XCArgs.mapping_tab = mapping_tab;
7199     XCArgs.length = length;
7200 
7201     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MUX_MAPPINGTAB, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7202     {
7203         printf("Obtain XC engine fail\n");
7204     }
7205 }
7206 //-------------------------------------------------------------------------------------------------
7207 /// Get input port from input source type
7208 /// @param  src                 \b IN: the query based on the input source type
7209 /// @param  port_ids            \b OUT: the port ID we get
7210 /// @param  u8port_count        \b OUT: how many ports we get
7211 //-------------------------------------------------------------------------------------------------
MDrv_XC_Mux_GetPort(void * pInstance,INPUT_SOURCE_TYPE_t src,E_MUX_INPUTPORT * port_ids,MS_U8 * u8port_count)7212 void MDrv_XC_Mux_GetPort(void *pInstance, INPUT_SOURCE_TYPE_t src, E_MUX_INPUTPORT* port_ids , MS_U8* u8port_count )
7213 {
7214     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7215     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7216     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7217     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7218 
7219     * u8port_count = pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[src].u32EnablePort ;
7220     port_ids[0] = pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[src].u32Port[0];
7221     port_ids[1] = pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[src].u32Port[1];
7222 }
7223 
7224 //-------------------------------------------------------------------------------------------------
7225 /// Get input port from input HDMI source type
7226 /// @param  src                 \b IN: the query based on the input HDMI type
7227 /// @return @ref E_MUX_INPUTPORT
7228 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_GetHDMIPort_U2(void * pInstance,INPUT_SOURCE_TYPE_t src)7229 E_MUX_INPUTPORT MApi_XC_Mux_GetHDMIPort_U2( void* pInstance, INPUT_SOURCE_TYPE_t src )
7230 {
7231     E_MUX_INPUTPORT ePort = INPUT_PORT_NONE_PORT;
7232     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7233     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7234     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7235     ePort = MDrv_XC_Mux_GetHDMIPort(pInstance, src);
7236     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7237     return ePort;
7238 }
7239 
MApi_XC_Mux_GetHDMIPort(INPUT_SOURCE_TYPE_t src)7240 E_MUX_INPUTPORT MApi_XC_Mux_GetHDMIPort( INPUT_SOURCE_TYPE_t src )
7241 {
7242     if (pu32XCInst == NULL)
7243     {
7244         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7245         return INPUT_PORT_NONE_PORT;
7246     }
7247 
7248     stXC_GET_MUX_HDMIPORT XCArgs;
7249     XCArgs.src = src;
7250     XCArgs.eReturnValue = INPUT_PORT_NONE_PORT;
7251 
7252     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MUX_HDMIPORT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7253     {
7254         printf("Obtain XC engine fail\n");
7255         return INPUT_PORT_NONE_PORT;
7256     }
7257     else
7258     {
7259         return XCArgs.eReturnValue;
7260     }
7261 }
7262 
7263 //-------------------------------------------------------------------------------------------------
7264 /// Set Support MHL Path Info
7265 /// @param u8MhlSupportInfo               \b IN:  MHL Support Info
7266 ///@return @ref MS_BOOL True if query success.
7267 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_SetSupportMhlPathInfo_U2(void * pInstance,MS_U8 u8MhlSupportInfo)7268 E_APIXC_ReturnValue MApi_XC_Mux_SetSupportMhlPathInfo_U2(void* pInstance, MS_U8 u8MhlSupportInfo)
7269 {
7270     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7271     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7272     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7273 
7274     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7275     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7276     pXCResourcePrivate->stdrvXC_MVideo_Context._u8MhlSupportInfo = u8MhlSupportInfo;
7277     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7278     return E_APIXC_RET_OK;
7279 }
7280 
MApi_XC_Mux_SetSupportMhlPathInfo(MS_U8 u8MhlSupportInfo)7281 E_APIXC_ReturnValue MApi_XC_Mux_SetSupportMhlPathInfo(MS_U8 u8MhlSupportInfo)
7282 {
7283     if (pu32XCInst == NULL)
7284     {
7285         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7286         return E_APIXC_RET_FAIL;
7287     }
7288 
7289     stXC_SET_MUX_SUPPORT_MHL_PATHINFO XCArgs;
7290     XCArgs.u8MhlSupportInfo = u8MhlSupportInfo;
7291     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
7292 
7293     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_SUPPORT_MHL_PATHINFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7294     {
7295         printf("Obtain XC engine fail\n");
7296         return E_APIXC_RET_FAIL;
7297     }
7298     else
7299     {
7300         return XCArgs.eReturnValue;
7301     }
7302 }
7303 
7304 //-------------------------------------------------------------------------------------------------
7305 /// Set MHL Hot Plug Inverse Info
7306 /// @param bIsMhlHotPlugInverse               \b IN:  MHL Hot Plug Inverse Info
7307 ///@return @ref MS_BOOL True if query success.
7308 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_SetMhlHotPlugInverseInfo_U2(void * pInstance,MS_BOOL bIsMhlHotPlugInverse)7309 E_APIXC_ReturnValue MApi_XC_Mux_SetMhlHotPlugInverseInfo_U2(void* pInstance, MS_BOOL bIsMhlHotPlugInverse)
7310 {
7311     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7312     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7313     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7314 
7315     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7316     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7317     pXCResourcePrivate->stdrvXC_MVideo_Context.g_bIsMhlHotPlugInverse = bIsMhlHotPlugInverse;
7318     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7319     return E_APIXC_RET_OK;
7320 }
7321 
MApi_XC_Mux_SetMhlHotPlugInverseInfo(MS_BOOL bIsMhlHotPlugInverse)7322 E_APIXC_ReturnValue MApi_XC_Mux_SetMhlHotPlugInverseInfo(MS_BOOL bIsMhlHotPlugInverse)
7323 {
7324     if (pu32XCInst == NULL)
7325     {
7326         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7327         return E_APIXC_RET_FAIL;
7328     }
7329 
7330     stXC_SET_MUX_MHL_HOTPLUG_INVERSE_INFO XCArgs;
7331     XCArgs.bIsMhlHotPlugInverse = bIsMhlHotPlugInverse;
7332     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
7333 
7334     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_MHL_HOTPLUG_INVERSE_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7335     {
7336         printf("Obtain XC engine fail\n");
7337         return E_APIXC_RET_FAIL;
7338     }
7339     else
7340     {
7341         return XCArgs.eReturnValue;
7342     }
7343 }
7344 //////////////////////////////////////
7345 //    Set path & power
7346 //////////////////////////////////////
7347 
_MApi_XC_Mux_SetPath(void * pInstance,INPUT_SOURCE_TYPE_t enInputSourceType,E_DEST_TYPE enOutputType)7348 static void _MApi_XC_Mux_SetPath(void *pInstance, INPUT_SOURCE_TYPE_t enInputSourceType, E_DEST_TYPE enOutputType)
7349 {
7350     MS_U8 u8Port_count = 0;
7351     E_MUX_INPUTPORT enPorts[3] = {INPUT_PORT_NONE_PORT, INPUT_PORT_NONE_PORT, INPUT_PORT_NONE_PORT};
7352     MS_U8 MS_U8index = 0 ;
7353     MS_U8 dest = (MS_U8)enOutputType;
7354     // Get source ports.
7355 
7356     MDrv_XC_Mux_GetPort(pInstance, enInputSourceType , enPorts , &u8Port_count );
7357     // Initial : Turn off Y/C mux
7358     // This is only for one VD
7359     if ( IsSrcTypeDigitalVD(enInputSourceType) && enOutputType != OUTPUT_CVBS1 && enOutputType != OUTPUT_CVBS2 )
7360     {
7361         MDrv_XC_mux_turnoff_ymux(pInstance);
7362         MDrv_XC_mux_turnoff_cmux(pInstance);
7363     }
7364 
7365     // For backward compatibility ( Remove if app layer ready )
7366     // Because we can not change the API, we add a check here for old behavior.
7367     if ( IsSrcTypeVga(enInputSourceType) && u8Port_count == 1)
7368     {
7369         MDrv_XC_mux_set_sync_port_by_dataport(pInstance, enPorts[0]);
7370     }
7371 
7372     for (  ;  MS_U8index < u8Port_count ; MS_U8index++ )
7373     {
7374         //printf(" Port index: %d  Port type: %d \n", MS_U8index ,enPorts[MS_U8index]);
7375         MDrv_XC_mux_dispatch(pInstance, enPorts[MS_U8index],(E_MUX_OUTPUTPORT)dest);
7376     }
7377 
7378     //printf(" Output port: %d \n", enOutputType);
7379 
7380 }
7381 
7382 //////////////////////////////////////
7383 //    Path Managerment Functions
7384 //////////////////////////////////////
7385 
7386 /*!
7387  *  Check path is valid or not
7388  *  @param src The input source of a path
7389  *  @param dest The destination of a path
7390  *  @return BOOL true if path is valid.
7391  */
_MApi_XC_Mux_CheckValidPath(void * pInstance,INPUT_SOURCE_TYPE_t src,E_DEST_TYPE dest)7392 MS_BOOL _MApi_XC_Mux_CheckValidPath(void *pInstance, INPUT_SOURCE_TYPE_t src , E_DEST_TYPE dest)
7393 {
7394     // After T3, there is no spec about SV -> CVBS out. (HW design)
7395     if ( IsSrcTypeSV(src) && ( dest == OUTPUT_CVBS1 || dest == OUTPUT_CVBS2 ) )
7396     {
7397         return Hal_XC_SVOutput_GetCaps(pInstance);
7398     }
7399     return TRUE;
7400 }
7401 
7402 /*!
7403  *  Search a patch and return the path index if the desire path founded
7404  *  @param src The input source of a path
7405  *  @param dest The destination of a path
7406  *  @return Path Id stored in Mux Controller
7407  */
_MApi_XC_Mux_SearchPath(void * pInstance,INPUT_SOURCE_TYPE_t src,E_DEST_TYPE dest)7408 static MS_S16 _MApi_XC_Mux_SearchPath(void *pInstance, INPUT_SOURCE_TYPE_t src, E_DEST_TYPE dest)
7409 {
7410     MS_S16 i;
7411     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7412     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7413     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7414     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7415     for ( i = 0 ; i < MAX_DATA_PATH_SUPPORTED; i++)
7416     {
7417         if ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src == src &&
7418              pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest == dest &&
7419              (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & DATA_PATH_USING)
7420            )
7421         {
7422             return i;
7423         }
7424     }
7425     return -1; // No maching path
7426 }
7427 
_MApi_XC_Mux_GetAvailablePath(void * pInstance,E_PATH_TYPE e_type)7428 static MS_S16 _MApi_XC_Mux_GetAvailablePath(void *pInstance, E_PATH_TYPE e_type)
7429 {
7430     MS_S16 index = 0, boundary = 0;
7431     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7432     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7433     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7434     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7435     if ( e_type == PATH_TYPE_ASYNCHRONOUS )
7436     {
7437         index = MAX_SYNC_DATA_PATH_SUPPORTED ;
7438         boundary = MAX_DATA_PATH_SUPPORTED ;
7439     }
7440     else
7441     {
7442         boundary = MAX_SYNC_DATA_PATH_SUPPORTED ;
7443     }
7444 
7445     for (; index < boundary; index++)
7446     {
7447         if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[index].u8PathStatus & DATA_PATH_USING)
7448         {
7449             continue;
7450         }
7451         else
7452         {
7453             return index;
7454         }
7455     }
7456 
7457     return -1; // No maching path
7458 
7459 }
7460 
7461 // Return sources connected with Main window or Sub window
_MApi_XC_Mux_GetUsingSources(void * pInstance,INPUT_SOURCE_TYPE_t * src_array)7462 static MS_U8 _MApi_XC_Mux_GetUsingSources(void *pInstance, INPUT_SOURCE_TYPE_t* src_array )
7463 {
7464     MS_U8 i = 0, j = 0 , available_source_count = 0;
7465     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7466     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7467     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7468     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7469     for ( ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
7470     {
7471         // Retrieve sources which is using right now.
7472         if (  ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ( DATA_PATH_USING ) ) != ( DATA_PATH_USING ) )
7473             continue;
7474 
7475         // Check if source on path i already in src_array
7476         for ( j = 0 ; j < available_source_count ; j++ )
7477         {
7478             if ( src_array[j] == pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src )
7479                 break;
7480         }
7481 
7482         if ( j >= available_source_count )
7483         {
7484             // no same source in src_array
7485             // only return source which connected with main or sub window
7486             if ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest != OUTPUT_CVBS1 &&
7487                  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest != OUTPUT_CVBS2 &&
7488                  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest != OUTPUT_SCALER_DWIN)
7489             {
7490                 src_array[available_source_count] = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src ;
7491                 available_source_count++;
7492             }
7493         }
7494     }
7495     return available_source_count;
7496 }
7497 // Public Functions
7498 
7499 //-------------------------------------------------------------------------------------------------
7500 /// Initialize Mux before using Mux controller
7501 /// @param  input_source_to_input_port      \b IN: a function to map from input source to input port
7502 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_Init_U2(void * pInstance,void (* input_source_to_input_port)(INPUT_SOURCE_TYPE_t src_ids,E_MUX_INPUTPORT * port_ids,MS_U8 * u8port_count))7503 void MApi_XC_Mux_Init_U2(void* pInstance, void (*input_source_to_input_port)(INPUT_SOURCE_TYPE_t src_ids , E_MUX_INPUTPORT* port_ids , MS_U8* u8port_count ) )
7504 {
7505     MS_U16 i;
7506     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7507     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7508     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7509     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7510 
7511     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7512     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7513     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount = 0;
7514     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.input_source_to_input_port = input_source_to_input_port;
7515     for ( i = 0 ; i < MAX_DATA_PATH_SUPPORTED; i++)
7516     {
7517         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus = 0;
7518     }
7519 
7520     for(i=0; i<INPUT_SOURCE_NUM; i++)
7521     {
7522         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[i] = 0;
7523     }
7524     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7525     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7526 }
7527 
MApi_XC_Mux_Init(void (* input_source_to_input_port)(INPUT_SOURCE_TYPE_t src_ids,E_MUX_INPUTPORT * port_ids,MS_U8 * u8port_count))7528 void MApi_XC_Mux_Init(void (*input_source_to_input_port)(INPUT_SOURCE_TYPE_t src_ids , E_MUX_INPUTPORT* port_ids , MS_U8* u8port_count ) )
7529 {
7530     if (pu32XCInst == NULL)
7531     {
7532         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7533         return;
7534     }
7535 
7536     stXC_SET_MUX_INIT XCArgs;
7537     XCArgs.input_source_to_input_port = input_source_to_input_port;
7538 
7539     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_INIT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7540     {
7541         printf("Obtain XC engine fail\n");
7542         return;
7543     }
7544     else
7545     {
7546         return;
7547     }
7548 }
7549 
7550 //-------------------------------------------------------------------------------------------------
7551 /// Monitor the source of Mux
7552 /// @param  bRealTimeMonitorOnly      \b IN: define whether do the monitor routine only for real time
7553 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_SourceMonitor_U2(void * pInstance,MS_BOOL bRealTimeMonitorOnly)7554 void MApi_XC_Mux_SourceMonitor_U2(void* pInstance, MS_BOOL bRealTimeMonitorOnly)
7555 {
7556     MS_S16 i;
7557     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7558     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7559     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7560 
7561     for ( i = 0 ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
7562     {
7563         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7564         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7565         if (  ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
7566               == ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
7567         {
7568             // execute path_thread()
7569             if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].path_thread != NULL)
7570             {
7571                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7572                 pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].path_thread(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src, bRealTimeMonitorOnly);
7573                 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7574             }
7575 
7576             // execute destination periodic handler
7577             if(((pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ENABLE_PERIODIC_HANDLER) == ENABLE_PERIODIC_HANDLER) &&
7578                (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_periodic_handler != NULL))
7579             {
7580                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7581                 pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_periodic_handler(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src, bRealTimeMonitorOnly );
7582                 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7583             }
7584         }
7585         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7586     }
7587 
7588     // This is patch for imme-switch. It can be fix in the feature.
7589     Hal_DVI_IMMESWITCH_PS_SW_Path();
7590 
7591 }
7592 
MApi_XC_Mux_SourceMonitor(MS_BOOL bRealTimeMonitorOnly)7593 void MApi_XC_Mux_SourceMonitor(MS_BOOL bRealTimeMonitorOnly)
7594 {
7595     if (pu32XCInst == NULL)
7596     {
7597         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7598         return;
7599     }
7600 
7601     stXC_SET_MUX_SOURCE_MONITOR XCArgs;
7602     XCArgs.bRealTimeMonitorOnly = bRealTimeMonitorOnly;
7603 
7604     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_SOURCE_MONITOR, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7605     {
7606         printf("Obtain XC engine fail\n");
7607         return;
7608     }
7609     else
7610     {
7611         return;
7612     }
7613 }
7614 
7615 //-------------------------------------------------------------------------------------------------
7616 /// A path is disabled after creating it (\ref MApi_XC_Mux_CreatePath)
7617 /// If a path is not enabled,   \ref MApi_XC_Mux_SourceMonitor will bypass it.
7618 /// @param PathId               \b IN: PathId The Path you want to enable
7619 /// @return 1 if enable successfuly. Return -1 if enable fail
7620 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_EnablePath_U2(void * pInstance,MS_U16 PathId)7621 MS_S16 MApi_XC_Mux_EnablePath_U2(void* pInstance, MS_U16 PathId)
7622 {
7623     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7624     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7625     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7626     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7627     if ( PathId >= MAX_DATA_PATH_SUPPORTED )
7628     {
7629         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7630         return -1;
7631     }
7632     else
7633     {
7634         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7635         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7636         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].u8PathStatus |= DATA_PATH_ENABLE;
7637         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7638         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7639         return 1;
7640     }
7641 }
7642 
MApi_XC_Mux_EnablePath(MS_U16 PathId)7643 MS_S16 MApi_XC_Mux_EnablePath(MS_U16 PathId)
7644 {
7645     if (pu32XCInst == NULL)
7646     {
7647         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7648         return -1;
7649     }
7650 
7651     stXC_SET_MUX_ENABLE_PATH XCArgs;
7652     XCArgs.PathId = PathId;
7653     XCArgs.s16ReturnValue = -1;
7654 
7655     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_ENABLE_PATH, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7656     {
7657         printf("Obtain XC engine fail\n");
7658         return -1;
7659     }
7660     else
7661     {
7662         return XCArgs.s16ReturnValue;
7663     }
7664 }
7665 
7666 
7667 #if (ENABLE_NONSTD_INPUT_MCNR==1)
7668 
7669 extern MS_U8 MDrv_AVD_GetRegValue(MS_U16 u16Addr);
7670 #define BK_AFEC_CC    (0x35CC)
7671 
_MApi_XC_Sys_Detect_UnStd_Input_Status_Init(void)7672 static void _MApi_XC_Sys_Detect_UnStd_Input_Status_Init(void)
7673 {
7674     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7675     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7676     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7677     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7678     pXCResourcePrivate->stdrvXC_MVideo.bIsUnStdSignal = FALSE;
7679     pXCResourcePrivate->stdrvXC_MVideo.u8StdSignalStbCnt = 0;
7680 }
7681 
_MApi_XC_CVBSUnStdISR(SC_INT_SRC eIntNum,void * pParam)7682 static void _MApi_XC_CVBSUnStdISR(SC_INT_SRC eIntNum, void * pParam)
7683 {
7684     UNUSED(eIntNum); UNUSED(pParam);
7685     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7686     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7687     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7688     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7689     if((MDrv_AVD_GetRegValue(BK_AFEC_CC) & 0x18) == 0x18)        // non-standard input
7690     {
7691         pXCResourcePrivate->stdrvXC_MVideo.u8StdSignalStbCnt = 0;
7692 
7693         if (pXCResourcePrivate->stdrvXC_MVideo.bIsUnStdSignal == FALSE)
7694         {
7695             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_27_L, 0x01, 0x01);
7696             pXCResourcePrivate->stdrvXC_MVideo.bIsUnStdSignal = TRUE;
7697             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_MApi_XC_CVBSUnStdISR: unStdSignal\n");
7698         }
7699     }
7700     else
7701     {
7702         if(pXCResourcePrivate->stdrvXC_MVideo.bIsUnStdSignal == TRUE)
7703         {
7704             pXCResourcePrivate->stdrvXC_MVideo.u8StdSignalStbCnt++;
7705 
7706             if(pXCResourcePrivate->stdrvXC_MVideo.u8StdSignalStbCnt > 10)
7707             {
7708                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_27_L, 0x00, 0x01);
7709                 pXCResourcePrivate->stdrvXC_MVideo.u8StdSignalStbCnt = 0;
7710                 pXCResourcePrivate->stdrvXC_MVideo.bIsUnStdSignal = FALSE;
7711                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_MApi_XC_CVBSUnStdISR: StdSignal\n");
7712             }
7713         }
7714     }
7715 }
7716 
7717 #endif
7718 
_Mdrv_XC_Mux_DeletePath(void * pInstance,MS_S16 PathId)7719 static void _Mdrv_XC_Mux_DeletePath(void* pInstance, MS_S16 PathId)
7720 {
7721     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7722     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7723     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7724     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7725     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7726 
7727     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].u8PathStatus = 0;
7728 
7729     if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount > 0)
7730         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount--;
7731 }
7732 
_Mdrv_XC_Mux_DecreaseSrcCreateTime(void * pInstance,INPUT_SOURCE_TYPE_t src,MS_BOOL bIsIncrease)7733 static void _Mdrv_XC_Mux_DecreaseSrcCreateTime(void* pInstance, INPUT_SOURCE_TYPE_t src, MS_BOOL bIsIncrease)
7734 {
7735     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7736     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7737     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7738     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7739     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7740 
7741     if (bIsIncrease)
7742     {
7743         // Increate src create time
7744         if(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[src] < 0xFFFF)
7745         {
7746             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[src]++;
7747         }
7748     }
7749     else
7750     {
7751         // Decrease src create time
7752         if(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[src] > 0)
7753         {
7754             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[src]--;
7755         }
7756     }
7757 }
7758 
7759 
7760 //-------------------------------------------------------------------------------------------------
7761 /// delete a path from Mux Controller.
7762 /// @param src              \b IN: Type of input source of a path you want to delete
7763 /// @param dest             \b IN: Type of destination of a path you want to delete
7764 /// @return 1 if delete successfuly. Return -1 if delete fail
7765 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_DeletePath_U2(void * pInstance,INPUT_SOURCE_TYPE_t src,E_DEST_TYPE dest)7766 MS_S16 MApi_XC_Mux_DeletePath_U2(void* pInstance, INPUT_SOURCE_TYPE_t src, E_DEST_TYPE dest)
7767 {
7768 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
7769     if (dest == OUTPUT_SCALER_SUB_WINDOW)
7770     {
7771         pInstance = g_pDevice1Instance;
7772         dest = OUTPUT_SCALER2_MAIN_WINDOW;
7773     }
7774 #endif
7775     // Maximum number of sources is the number of pathes
7776     INPUT_SOURCE_TYPE_t _InputSource[MAX_SYNC_DATA_PATH_SUPPORTED] ;
7777     MS_U8 _source_count = 0;
7778     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7779     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7780     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7781     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
7782     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7783     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7784     _XC_ENTRY(pInstance);
7785 
7786     MS_S16 PathId = _MApi_XC_Mux_SearchPath(pInstance, src,dest);
7787 
7788     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"=========== MApi_XC_Mux_DeletePath(ID 0x%x) is called =========== \n", PathId);
7789     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Source : %d   Destination : %d \n",src,dest);
7790 
7791     if ( PathId != -1 )
7792     {
7793         MS_U8 u8Index = 0;
7794 
7795         // Initial _InputSource
7796         for (; u8Index < MAX_SYNC_DATA_PATH_SUPPORTED; u8Index++)
7797         {
7798             _InputSource[u8Index] = INPUT_SOURCE_NONE;
7799         }
7800 
7801         // Clear status.
7802 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
7803         _Mdrv_XC_Mux_DeletePath(g_pDevice0Instance, PathId);
7804         _Mdrv_XC_Mux_DeletePath(g_pDevice1Instance, PathId);
7805 #else
7806         _Mdrv_XC_Mux_DeletePath(pInstance, PathId);
7807 #endif
7808         // Update ADC setting for multi-source.
7809         if ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount > 0 )
7810         {
7811             _source_count = _MApi_XC_Mux_GetUsingSources(pInstance, _InputSource);
7812 
7813             XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Total using source current %d \n",_source_count);
7814 
7815             MDrv_XC_ADC_SetInputSource(pInstance, _InputSource, _source_count);
7816         }
7817 
7818         if ( IsSrcTypeHDMI(src) || IsSrcTypeDVI(src)  )
7819         {
7820             // Power down all HDMI power
7821             // because HDMI cannot PIP with HDMI, so we can power down all the HDMIs
7822             Hal_SC_mux_set_dvi_mux(pInstance, 0xFF, HAL_OUTPUTPORT_NONE_PORT);
7823         }
7824 
7825 #ifndef DONT_USE_CMA
7826 #if (XC_SUPPORT_CMA == TRUE)
7827         if (
7828 #if (HW_DESIGN_4K2K_VER == 7)
7829             (psXCInstPri->u32DeviceID == 0) &&
7830             (dest == OUTPUT_SCALER_MAIN_WINDOW) &&
7831 #endif
7832 #ifndef UFO_XC_SUPPORT_SUB_CMA
7833             (dest != OUTPUT_SCALER2_MAIN_WINDOW) &&
7834 #endif
7835             (pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == FALSE))
7836         {
7837             MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
7838             MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
7839         }
7840 #endif
7841 #endif
7842         //Disable SUB_Window CLK
7843         if(dest == OUTPUT_SCALER_SUB_WINDOW)
7844         {
7845             MApi_XC_EnableCLK_for_SUB(pInstance, DISABLE);
7846             MDrv_XC_Enable_Extra_Request(pInstance, DISABLE);
7847         }
7848         else if(dest == OUTPUT_SCALER_DWIN)
7849         {
7850             MApi_XC_EnableCLK_for_DIP(pInstance, DISABLE);
7851         }
7852 
7853         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"=========== Path deleted success =========== \n");
7854 
7855         // Decrease src create time
7856 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
7857         _Mdrv_XC_Mux_DecreaseSrcCreateTime(g_pDevice0Instance, src, FALSE);
7858         _Mdrv_XC_Mux_DecreaseSrcCreateTime(g_pDevice0Instance, src, FALSE);
7859 #else
7860         _Mdrv_XC_Mux_DecreaseSrcCreateTime(pInstance, src, FALSE);
7861 #endif
7862         if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[src] == 0)
7863         {
7864             if ( IsSrcTypeYPbPr(src) || IsSrcTypeVga(src)  )
7865             {
7866                 // ADC have to set as free run
7867                 MDrv_XC_ADC_Set_Freerun(pInstance, TRUE);
7868             }
7869         }
7870 
7871 #if (ENABLE_NONSTD_INPUT_MCNR == 1)
7872         MS_U8 i;
7873 
7874         for(i=0; i<_source_count; i++)
7875         {
7876             if(IsSrcTypeATV(_InputSource[i]))
7877             {
7878                 break;
7879             }
7880         }
7881 
7882         if(i==_source_count)
7883         {
7884             // there is no more ATV input, de-attach ISR
7885             MDrv_XC_InterruptDeAttach(pInstance, XC_INT_VSINT, _MApi_XC_CVBSUnStdISR, &pXCResourcePrivate->stdrvXC_MVideo.u8UnStdOutput[MAIN_WINDOW]);
7886         }
7887 #endif
7888 
7889         // We clear Input source variable here. To reset scaler IP again if same source connected again.
7890         if (dest == OUTPUT_SCALER_MAIN_WINDOW)
7891         {
7892             pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[MAIN_WINDOW] = INPUT_SOURCE_NONE;
7893         }
7894         else if (dest == OUTPUT_SCALER_SUB_WINDOW)
7895         {
7896             pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[SUB_WINDOW] = INPUT_SOURCE_NONE;
7897         }
7898 
7899         _XC_RETURN(pInstance);
7900         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7901         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7902 
7903         return TRUE;
7904     }
7905     else
7906     {
7907         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"This path is not exist\n");
7908         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"=========== Path deleted fail =========== \n");
7909         _XC_RETURN(pInstance);
7910         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7911         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
7912         return -1;
7913     }
7914 }
7915 
MApi_XC_Mux_DeletePath(INPUT_SOURCE_TYPE_t src,E_DEST_TYPE dest)7916 MS_S16 MApi_XC_Mux_DeletePath(INPUT_SOURCE_TYPE_t src, E_DEST_TYPE dest)
7917 {
7918     if (pu32XCInst == NULL)
7919     {
7920         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7921         return -1;
7922     }
7923 
7924     stXC_SET_MUX_DELETE_PATH XCArgs;
7925     XCArgs.src = src;
7926     XCArgs.dest = dest;
7927     XCArgs.s16ReturnValue = -1;
7928 
7929     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_DELETE_PATH, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7930     {
7931         printf("Obtain XC engine fail\n");
7932         return -1;
7933     }
7934     else
7935     {
7936         return XCArgs.s16ReturnValue;
7937     }
7938 }
7939 
7940 //-------------------------------------------------------------------------------------------------
7941 /// Trigger Sync Event on Mux Controller.
7942 /// The Mux Controller will pass src and *para to each Sync Event Handler (refer synchronous_event_handler of MUX_DATA_PATH also).
7943 ///  ( Delegate Function:
7944 ///    Send necessary parameter to SyncEventHandler of each synchronous_path which source is 'src' )
7945 /// @param src          \b IN: The input source which triggers Sync Event
7946 /// @param para         \b IN: A pointer points to parameters which need to pass to Event Handler
7947 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_TriggerPathSyncEvent_U2(void * pInstance,INPUT_SOURCE_TYPE_t src,void * para)7948 void MApi_XC_Mux_TriggerPathSyncEvent_U2( void* pInstance, INPUT_SOURCE_TYPE_t src , void* para)
7949 {
7950     MS_S16 i;
7951     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7952     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7953     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7954 
7955     for ( i = 0 ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
7956     {
7957         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7958         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7959         if (  ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
7960               != ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
7961         {
7962             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7963             continue;
7964         }
7965 
7966         // send 'src' to event handler of each path
7967         if ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src == src &&
7968              pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].synchronous_event_handler != NULL)
7969         {
7970             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7971             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].synchronous_event_handler(src, para);
7972             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
7973         }
7974         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
7975     }
7976 }
7977 
MApi_XC_Mux_TriggerPathSyncEvent(INPUT_SOURCE_TYPE_t src,void * para)7978 void MApi_XC_Mux_TriggerPathSyncEvent( INPUT_SOURCE_TYPE_t src , void* para)
7979 {
7980     if (pu32XCInst == NULL)
7981     {
7982         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
7983         return;
7984     }
7985 
7986     stXC_SET_MUX_TRIGGER_PATH_SYNC_EVENT XCArgs;
7987     XCArgs.src = src;
7988     XCArgs.para = para;
7989 
7990     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_TRIGGER_PATH_SYNC_EVENT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
7991     {
7992         printf("Obtain XC engine fail\n");
7993         return;
7994     }
7995     else
7996     {
7997         return;
7998     }
7999 }
8000 
8001 /*!
8002  *  Trigger Sync Event on Mux Controller.
8003  *  The Mux Controller will pass src and *para to each Sync Event Handler (refer to synchronous_event_handler
8004  *   of MUX_DATA_PATH also).
8005  *
8006  *  ( Delegate Function:
8007  *    Send necessary parameter to SyncEventHandler of each synchronous_path which source is 'src' )
8008  *  @param src The input source which triggers Sync Event
8009  *  @param para A pointer points to parameters which need to pass to Event Handler
8010  */
8011 //-------------------------------------------------------------------------------------------------
8012 /// Set the specific window
8013 /// @param  src             \b IN: the source type for handler
8014 /// @param para         \b IN: A pointer points to parameters which need to pass to Event Handler
8015 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_TriggerDestOnOffEvent_U2(void * pInstance,INPUT_SOURCE_TYPE_t src,void * para)8016 void MApi_XC_Mux_TriggerDestOnOffEvent_U2( void* pInstance, INPUT_SOURCE_TYPE_t src , void* para)
8017 {
8018     MS_S16 i;
8019     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8020     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8021     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8022 
8023     for ( i = 0 ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
8024     {
8025         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8026         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8027         if (  ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
8028               != ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
8029         {
8030             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8031             continue;
8032         }
8033 
8034         // send 'src' to event handler of each path
8035         if ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src == src &&
8036              pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_on_off_event_handler != NULL)
8037         {
8038             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8039             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_on_off_event_handler(src, para);
8040             _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8041         }
8042         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8043     }
8044 }
8045 
MApi_XC_Mux_TriggerDestOnOffEvent(INPUT_SOURCE_TYPE_t src,void * para)8046 void MApi_XC_Mux_TriggerDestOnOffEvent( INPUT_SOURCE_TYPE_t src , void* para)
8047 {
8048     if (pu32XCInst == NULL)
8049     {
8050         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8051         return;
8052     }
8053 
8054     stXC_SET_MUX_TRIGGER_DEST_ONOFF_EVENT XCArgs;
8055     XCArgs.src = src;
8056     XCArgs.para = para;
8057 
8058     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_TRIGGER_DEST_ONOFF_EVENT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8059     {
8060         printf("Obtain XC engine fail\n");
8061         return;
8062     }
8063     else
8064     {
8065         return;
8066     }
8067 }
8068 //-------------------------------------------------------------------------------------------------
8069 /// This function was used to enable/disable the destination periodic handler
8070 /// After enabled periodic hander, Mux Controller will pass the parameters to this handler and execute it periodically
8071 /// @param  src             \b IN: the source type for handler
8072 /// @param  bEnable         \b IN: Enable/Disable the priodic handler.
8073 /// @return 1 if successfuly. Return -1 if failed.
8074 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_OnOffPeriodicHandler_U2(void * pInstance,INPUT_SOURCE_TYPE_t src,MS_BOOL bEnable)8075 MS_S16 MApi_XC_Mux_OnOffPeriodicHandler_U2( void* pInstance, INPUT_SOURCE_TYPE_t src, MS_BOOL bEnable)
8076 {
8077     MS_S16 i;
8078     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8079     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8080     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8081 
8082     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8083     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8084     for ( i = 0 ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
8085     {
8086         if (  ( pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
8087               != ( DATA_PATH_ENABLE | DATA_PATH_USING ) )
8088         {
8089             continue;
8090         }
8091 
8092         // send 'src' to event handler of each path
8093         if(bEnable)
8094         {
8095             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus |= ENABLE_PERIODIC_HANDLER;
8096         }
8097         else
8098         {
8099             pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus &= ~ENABLE_PERIODIC_HANDLER;
8100         }
8101     }
8102     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8103     return i;
8104 }
8105 
MApi_XC_Mux_OnOffPeriodicHandler(INPUT_SOURCE_TYPE_t src,MS_BOOL bEnable)8106 MS_S16 MApi_XC_Mux_OnOffPeriodicHandler( INPUT_SOURCE_TYPE_t src, MS_BOOL bEnable)
8107 {
8108     if (pu32XCInst == NULL)
8109     {
8110         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8111         return -1;
8112     }
8113 
8114     stXC_SET_MUX_ONOFF_PERIODIC_HANDLER XCArgs;
8115     XCArgs.src = src;
8116     XCArgs.bEnable = bEnable;
8117     XCArgs.s16ReturnValue = -1;
8118 
8119     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_ONOFF_PERIODIC_HANDLER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8120     {
8121         printf("Obtain XC engine fail\n");
8122         return -1;
8123     }
8124     else
8125     {
8126         return XCArgs.s16ReturnValue;
8127     }
8128 }
8129 
8130 typedef enum
8131 {
8132     E_OnPathAdd = 0,
8133     E_OnPathDel= 1,
8134     E_PathMax,
8135 }E_PathStatus;
8136 
8137 
_Mdrv_XC_Mux_CreatePath(void * pInstance,XC_MUX_PATH_INFO * Path_Info,MS_S16 PathId)8138 static void _Mdrv_XC_Mux_CreatePath(void* pInstance, XC_MUX_PATH_INFO* Path_Info, MS_S16 PathId)
8139 {
8140     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8141     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8142     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8143     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8144     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8145 
8146     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount++;
8147     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].e_PathType = Path_Info->Path_Type;
8148     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].src = Path_Info->src;
8149     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].dest = Path_Info->dest;
8150     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].u8PathStatus = DATA_PATH_USING;
8151     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].path_thread = Path_Info->path_thread;
8152     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].synchronous_event_handler = Path_Info->SyncEventHandler;
8153     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].dest_on_off_event_handler = Path_Info->DestOnOff_Event_Handler;
8154     pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].dest_periodic_handler = Path_Info->dest_periodic_handler;
8155 
8156 #if (HW_DESIGN_4K2K_VER == 7)
8157 //temp make a default map matrix for Kano
8158     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_DTV].u32EnablePort = 1;
8159     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_DTV].u32Port[0] = INPUT_PORT_MVOP;
8160     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_DTV2].u32EnablePort = 1;
8161     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_DTV2].u32Port[0] = INPUT_PORT_MVOP2;
8162     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_STORAGE].u32EnablePort = 1;
8163     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_STORAGE].u32Port[0] = INPUT_PORT_MVOP;
8164     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_STORAGE2].u32EnablePort = 1;
8165     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_STORAGE2].u32Port[0] = INPUT_PORT_MVOP2;
8166     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_HDMI].u32EnablePort = 1;
8167     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_HDMI].u32Port[0] = INPUT_PORT_DVI0;
8168     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_SCALER_OP].u32EnablePort = 1;
8169     pXCResourcePrivate->stdrvXC_MVideo.mapping_tab[INPUT_SOURCE_SCALER_OP].u32Port[0] = INPUT_PORT_SCALER_OP;
8170 #ifdef MSOS_TYPE_LINUX_KERNEL
8171     //for msAPI usage, we set dest_periodic_handler by utopia PQ's MDrv_PQ_AdaptiveTuning
8172 #ifndef DISABLE_PQ_FUNCTION
8173     if(psXCInstPri->u32DeviceID == 0)
8174     {
8175         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].dest_periodic_handler = MDrv_PQ_AdaptiveTuning;
8176     }
8177     else
8178     {
8179         pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[PathId].dest_periodic_handler = NULL;
8180     }
8181 #endif
8182 #endif
8183 #endif
8184 
8185 }
8186 //-------------------------------------------------------------------------------------------------
8187 /// Create a path in Mux Controller.
8188 /// @param  Path_Info               \b IN: the information of the path
8189 /// @param  u32InitDataLen          \b IN: the length of the Path_Info
8190 /// @return @ref MS_S16 return the path id, or -1 when any error is happened
8191 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_CreatePath_U2(void * pInstance,XC_MUX_PATH_INFO * Path_Info,MS_U32 u32InitDataLen)8192 MS_S16 MApi_XC_Mux_CreatePath_U2(void* pInstance, XC_MUX_PATH_INFO* Path_Info , MS_U32 u32InitDataLen)
8193 {
8194 #ifdef MSOS_TYPE_LINUX_KERNEL
8195     if(!is_compat_task())
8196     {
8197         if(u32InitDataLen != sizeof(XC_MUX_PATH_INFO) || Path_Info == NULL)
8198         {
8199             // ASSERT when driver is not initiallized
8200             MS_ASSERT(0);
8201             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8202             return -1;
8203         }
8204     }
8205 #else
8206     if(u32InitDataLen != sizeof(XC_MUX_PATH_INFO) || Path_Info == NULL)
8207     {
8208         // ASSERT when driver is not initiallized
8209         MS_ASSERT(0);
8210         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8211         return -1;
8212     }
8213 #endif
8214 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8215     if (Path_Info->dest == OUTPUT_SCALER_SUB_WINDOW)
8216     {
8217         pInstance = g_pDevice1Instance;
8218         Path_Info->dest = OUTPUT_SCALER2_MAIN_WINDOW;
8219     }
8220 #endif
8221     MS_S16 PathId;
8222     MS_U8 u8Index=0;
8223 
8224     // Maximum number of sources is the number of pathes
8225     INPUT_SOURCE_TYPE_t _InputSource[MAX_SYNC_DATA_PATH_SUPPORTED] ;
8226     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8227     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8228     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8229     MS_U8 _source_count = 0;
8230     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8231 
8232     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8233     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8234     _XC_ENTRY(pInstance);
8235 
8236     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"=========== MApi_XC_Mux_CreatePath is called =========== \n");
8237     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Source : %d   Destination : %d \n",Path_Info->src,Path_Info->dest);
8238 
8239     if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount >= MAX_DATA_PATH_SUPPORTED)
8240     {
8241         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"There is no avaliable path. Current Total Path Count : %d ",pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount );
8242         _XC_RETURN(pInstance);
8243         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8244         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8245         return -1; // No avaliable path.
8246     }
8247 
8248     if ( _MApi_XC_Mux_SearchPath(pInstance, Path_Info->src,Path_Info->dest) != -1)
8249     {
8250         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Path already exist\n");
8251         _XC_RETURN(pInstance);
8252         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8253         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8254         return -1; // Path exist
8255     }
8256 
8257     if ( _MApi_XC_Mux_CheckValidPath(pInstance, Path_Info->src, Path_Info->dest) == FALSE)
8258     {
8259         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Path is invalid\n");
8260         _XC_RETURN(pInstance);
8261         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8262         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8263         return -1; // Path is invalid
8264     }
8265 
8266 
8267     if(_XC_Mutex == -1)
8268     {
8269         MS_ASSERT(0);
8270         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"XC dirver have to be initiallized first \n");
8271         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8272         _XC_RETURN(pInstance);
8273         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8274         return -1;
8275     }
8276 
8277     //Add one path
8278     PathId= _MApi_XC_Mux_GetAvailablePath(pInstance, Path_Info->Path_Type);
8279 
8280     if ( PathId == -1 )
8281     {
8282         XC_LOG_TRACE(XC_DBGLEVEL_MUX,"There is no avaliable path. Current Total Path Count : %d ",pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u8PathCount );
8283         _XC_RETURN(pInstance);
8284         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8285         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8286         return -1; // no available path
8287     }
8288 
8289     // Path create.
8290 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8291     _Mdrv_XC_Mux_CreatePath(g_pDevice0Instance, Path_Info, PathId);
8292     _Mdrv_XC_Mux_CreatePath(g_pDevice1Instance, Path_Info, PathId);
8293 #else
8294     _Mdrv_XC_Mux_CreatePath(pInstance, Path_Info, PathId);
8295 #endif
8296     // Set physical registers after path created.
8297     _MApi_XC_Mux_SetPath(pInstance, Path_Info->src,Path_Info->dest);
8298     if ((pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == TRUE) ||
8299         (pXCResourcePrivate->sthal_Optee.op_tee_xc[SUB_WINDOW].isEnable == TRUE))
8300     {
8301         XC_OPTEE_MUX_DATA st_xc_mux_data;
8302         MDrv_XC_OPTEE_Mux(pInstance, E_XC_OPTEE_SET_MUX, st_xc_mux_data);
8303     }
8304 
8305     // Initial _InputSource
8306     for (; u8Index < MAX_SYNC_DATA_PATH_SUPPORTED; u8Index++)
8307     {
8308         _InputSource[u8Index] = INPUT_SOURCE_NONE;
8309     }
8310 
8311     // Update ADC setting for multi-source.
8312     _source_count = _MApi_XC_Mux_GetUsingSources(pInstance, _InputSource);
8313 
8314     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"Total using source current %d \n",_source_count);
8315 
8316     MDrv_XC_ADC_SetInputSource(pInstance, _InputSource, _source_count);
8317 
8318     // Check if need calibration or not
8319     if(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.u16SrcCreateTime[Path_Info->src] == 0)
8320     {
8321         // calibrate input source
8322         MDrv_XC_ADC_Source_Calibrate(pInstance, MDrv_XC_ADC_ConvertSrcToADCSrc(pInstance, Path_Info->src));
8323 
8324         if(IsSrcTypeYPbPr(Path_Info->src))
8325         {
8326             MDrv_XC_ADC_SetSoGCal(pInstance);
8327             MsOS_DelayTask(10);
8328         }
8329 
8330         if ( IsSrcTypeYPbPr(Path_Info->src) ||
8331              IsSrcTypeVga(Path_Info->src)  )
8332         {
8333             // ADC have to set as free run
8334             MDrv_XC_ADC_Set_Freerun(pInstance, TRUE);
8335         }
8336 
8337     }
8338 
8339     // Increate src create time
8340 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8341         _Mdrv_XC_Mux_DecreaseSrcCreateTime(g_pDevice0Instance, Path_Info->src, TRUE);
8342         _Mdrv_XC_Mux_DecreaseSrcCreateTime(g_pDevice0Instance, Path_Info->src, TRUE);
8343 #else
8344         _Mdrv_XC_Mux_DecreaseSrcCreateTime(pInstance, Path_Info->src, TRUE);
8345 #endif
8346     //Enable Sub_Window CLK
8347     if(Path_Info->dest == OUTPUT_SCALER_SUB_WINDOW)
8348     {
8349         // Disable Pre-Scaling for ATV pink issue
8350         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_05_L, 0x00 , BIT(15) );
8351         MApi_XC_EnableCLK_for_SUB(pInstance, ENABLE);
8352     }
8353     else if(Path_Info->dest == OUTPUT_SCALER_MAIN_WINDOW)
8354     {
8355         // Disable Pre-Scaling for ATV pink issue
8356         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_05_L, 0x00 , BIT(15) );
8357     }
8358     else if(Path_Info->dest == OUTPUT_SCALER_DWIN)
8359     {
8360         // Enable DIP window clock
8361         MApi_XC_EnableCLK_for_DIP(pInstance, ENABLE);
8362     }
8363 
8364 
8365     _XC_RETURN(pInstance);
8366 
8367     XC_LOG_TRACE(XC_DBGLEVEL_MUX,"=========== Path created success =========== \n");
8368 
8369 #if (ENABLE_NONSTD_INPUT_MCNR == 1)
8370     if(IsSrcTypeATV(Path_Info->src) &&
8371       (!MApi_XC_InterruptIsAttached(XC_INT_VSINT, _MApi_XC_CVBSUnStdISR, &pXCResourcePrivate->stdrvXC_MVideo.u8UnStdOutput[MAIN_WINDOW])))
8372     {
8373         // Re-init state machine
8374         _MApi_XC_Sys_Detect_UnStd_Input_Status_Init();
8375 
8376         // Attach ISR
8377         MDrv_XC_InterruptAttach(pInstance, XC_INT_VSINT, _MApi_XC_CVBSUnStdISR, &pXCResourcePrivate->stdrvXC_MVideo.u8UnStdOutput[MAIN_WINDOW]);
8378     }
8379 #endif
8380     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8381     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8382     return PathId;
8383 }
8384 
MApi_XC_Mux_CreatePath(XC_MUX_PATH_INFO * Path_Info,MS_U32 u32InitDataLen)8385 MS_S16 MApi_XC_Mux_CreatePath(XC_MUX_PATH_INFO* Path_Info , MS_U32 u32InitDataLen)
8386 {
8387     if (pu32XCInst == NULL)
8388     {
8389         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8390         return -1;
8391     }
8392 
8393     stXC_SET_MUX_CREATE_PATH XCArgs;
8394     XCArgs.Path_Info = Path_Info;
8395     XCArgs.u32InitDataLen = u32InitDataLen;
8396     XCArgs.s16ReturnValue = -1;
8397 
8398     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MUX_CREATE_PATH, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8399     {
8400         printf("Obtain XC engine fail\n");
8401         return -1;
8402     }
8403     else
8404     {
8405         return XCArgs.s16ReturnValue;
8406     }
8407 }
8408 
8409 //-------------------------------------------------------------------------------------------------
8410 /// Map input source to VD Ymux port
8411 /// @param  u8InputSourceType      \b IN: input source type
8412 /// @return @ref MS_U8
8413 //-------------------------------------------------------------------------------------------------
MApi_XC_MUX_MapInputSourceToVDYMuxPORT_U2(void * pInstance,INPUT_SOURCE_TYPE_t u8InputSourceType)8414 MS_U8 MApi_XC_MUX_MapInputSourceToVDYMuxPORT_U2( void* pInstance, INPUT_SOURCE_TYPE_t u8InputSourceType )
8415 {
8416     MS_U8 u8Return = 0;
8417     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8418     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8419     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8420     u8Return = MDrv_XC_MUX_MapInputSourceToVDYMuxPORT(pInstance, u8InputSourceType );
8421     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8422     return u8Return;
8423 }
8424 
MApi_XC_MUX_MapInputSourceToVDYMuxPORT(INPUT_SOURCE_TYPE_t u8InputSourceType)8425 MS_U8 MApi_XC_MUX_MapInputSourceToVDYMuxPORT( INPUT_SOURCE_TYPE_t u8InputSourceType )
8426 {
8427     if (pu32XCInst == NULL)
8428     {
8429         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8430         return 0;
8431     }
8432 
8433     stXC_GET_MUX_INPUTSOURCE2VDYMUXPORT XCArgs;
8434     XCArgs.u8InputSourceType = u8InputSourceType;
8435     XCArgs.u8ReturnValue = 0;
8436 
8437     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MUX_INPUTSOURCE2VDYMUXPORT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8438     {
8439         printf("Obtain XC engine fail\n");
8440         return 0;
8441     }
8442     else
8443     {
8444         return XCArgs.u8ReturnValue;
8445     }
8446 }
8447 
8448 //-------------------------------------------------------------------------------------------------
8449 /// Get Paths in driver.
8450 /// @param  Paths      \b OUT: Path information
8451 /// @return @ref MS_U8
8452 //-------------------------------------------------------------------------------------------------
MApi_XC_Mux_GetPathInfo_U2(void * pInstance,XC_MUX_PATH_INFO * Paths)8453 MS_U8 MApi_XC_Mux_GetPathInfo_U2(void* pInstance, XC_MUX_PATH_INFO* Paths)
8454 {
8455     MS_S16 i;
8456     MS_U8 count;
8457     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8458     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8459     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8460 
8461     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8462     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8463     for ( i = 0, count = 0 ; i < MAX_SYNC_DATA_PATH_SUPPORTED ; i++)
8464     {
8465         if (pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & DATA_PATH_USING)
8466         {
8467             Paths[count].src = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src;
8468             Paths[count].dest = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest;
8469             Paths[count].path_thread = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].path_thread;
8470             Paths[count].SyncEventHandler =  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].synchronous_event_handler;
8471             Paths[count].DestOnOff_Event_Handler =  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_on_off_event_handler;
8472             Paths[count].dest_periodic_handler =  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_periodic_handler;
8473             count++;
8474             //printf(" Path Id: [%d]  Source: %d   Destination: %d \n",i, s_InputSource_Mux_attr.Mux_DataPaths[i].src,
8475             //s_InputSource_Mux_attr.Mux_DataPaths[i].dest);
8476 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8477             if (Paths[count].dest == OUTPUT_SCALER2_MAIN_WINDOW)
8478             {
8479                 Paths[count].dest = OUTPUT_SCALER_SUB_WINDOW;
8480             }
8481 #endif
8482         }
8483     }
8484     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8485     return count;
8486 }
8487 
MApi_XC_Mux_GetPathInfo(XC_MUX_PATH_INFO * Paths)8488 MS_U8 MApi_XC_Mux_GetPathInfo(XC_MUX_PATH_INFO* Paths)
8489 {
8490     if (pu32XCInst == NULL)
8491     {
8492         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8493         return 0;
8494     }
8495 
8496     stXC_GET_MUX_PATHINFO XCArgs;
8497     XCArgs.Paths = Paths;
8498     XCArgs.u8ReturnValue = 0;
8499 
8500     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MUX_PATHINFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8501     {
8502         printf("Obtain XC engine fail\n");
8503         return 0;
8504     }
8505     else
8506     {
8507         return XCArgs.u8ReturnValue;
8508     }
8509 }
8510 
8511 //-------------------------------------------------------------------------------------------------
8512 /// Get XC library version
8513 /// @param  ppVersion                  \b OUT: store the version in this member
8514 /// @return @ref E_APIXC_ReturnValue
8515 //-------------------------------------------------------------------------------------------------
MApi_XC_GetLibVer_U2(void * pInstance,const MSIF_Version ** ppVersion)8516 E_APIXC_ReturnValue MApi_XC_GetLibVer_U2(void* pInstance, const MSIF_Version **ppVersion)
8517 {
8518     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8519 
8520     if (!ppVersion)
8521     {
8522         return E_APIXC_RET_FAIL;
8523     }
8524 
8525     *ppVersion = &_api_xc_version;
8526     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8527     return E_APIXC_RET_OK;
8528 }
MApi_XC_GetLibVer(const MSIF_Version ** ppVersion)8529 E_APIXC_ReturnValue MApi_XC_GetLibVer(const MSIF_Version **ppVersion)
8530 {
8531     //This function may be called before creating pu32XCInst
8532     if (!ppVersion)
8533     {
8534         return E_APIXC_RET_FAIL;
8535     }
8536 
8537     *ppVersion = &_api_xc_version;
8538     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8539     return E_APIXC_RET_OK;
8540 
8541     if (pu32XCInst == NULL)
8542     {
8543         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8544         return E_APIXC_RET_FAIL;
8545     }
8546 
8547     stXC_GET_LIB_VER XCArgs;
8548     XCArgs.ppVersion = ppVersion;
8549     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
8550 
8551     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_LIB_VERSION, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8552     {
8553         printf("Obtain XC engine fail\n");
8554         return E_APIXC_RET_FAIL;
8555     }
8556     else
8557     {
8558         return XCArgs.eReturnValue;
8559     }
8560 }
8561 
8562 //-------------------------------------------------------------------------------------------------
8563 /// Get XC Information
8564 /// @return @ref XC_ApiInfo returnthe XC information in this member
8565 //-------------------------------------------------------------------------------------------------
MApi_XC_GetInfo_U2(void * pInstance)8566 XC_ApiInfo * MApi_XC_GetInfo_U2(void* pInstance)
8567 {
8568     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8569     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8570     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8571     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8572     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8573     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8574     MDrv_XC_GetInfo(pInstance, &pXCResourcePrivate->stdrvXC_MVideo._stXC_ApiInfo);
8575     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8576     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8577     return &pXCResourcePrivate->stdrvXC_MVideo._stXC_ApiInfo;
8578 }
8579 
MApi_XC_GetInfo(void)8580 const XC_ApiInfo * MApi_XC_GetInfo(void)
8581 {
8582     stXC_CMD_GET_INFO XCArgs;
8583     static XC_ApiInfo Getinfo;
8584 
8585     XCArgs.stReturnValue = &Getinfo;
8586 
8587     if (pu32XCInst == NULL)
8588     {
8589         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8590         return XCArgs.stReturnValue;
8591     }
8592 
8593     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8594     {
8595         printf("Obtain XC engine fail\n");
8596         return XCArgs.stReturnValue; // return meaningless value because get instance failed.
8597     }
8598     else
8599     {
8600         return XCArgs.stReturnValue;
8601     }
8602 }
8603 
8604 
8605 //-------------------------------------------------------------------------------------------------
8606 /// Extended interface for Getting XC Status of specific window(Main/Sub)
8607 /// @param  pDrvStatusEx                  \b OUT: store the status
8608 /// @param  eWindow                     \b IN: which window(Main/Sub) is going to get status
8609 /// @return @ref MS_U16 return the copied length of input structure
8610 //-------------------------------------------------------------------------------------------------
MApi_XC_GetStatusEx_U2(void * pInstance,XC_ApiStatusEx * pDrvStatusEx,SCALER_WIN eWindow)8611 MS_U16 MApi_XC_GetStatusEx_U2(void* pInstance, XC_ApiStatusEx *pDrvStatusEx, SCALER_WIN eWindow)
8612 {
8613     XC_ApiStatusEx DrvStatusEx;
8614     MS_U16 u16CopiedLength = sizeof(XC_ApiStatusEx);
8615     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8616 
8617     if((NULL == pDrvStatusEx) || (pDrvStatusEx->u16ApiStatusEX_Length == 0))
8618     {
8619         //We consider compatible operation from version2 , so reject the info init when version invalid
8620         XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MApi_XC_GetStatusEx: Null paramter or Wrong u16ApiStatusEX_Length!!\n")
8621 
8622         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8623         return 0;
8624     }
8625 
8626     // the version control is coming in with version 1
8627     if(pDrvStatusEx->u32ApiStatusEx_Version < 1)
8628     {
8629         //We consider compatible operation from version1 , so reject the info init when version invalid
8630         XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MApi_XC_GetStatusEx: please check your u32ApiStatusEx_Version, it should not set to 0!!\n")
8631         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8632 
8633         return 0;
8634     }
8635     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8636     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8637     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8638 
8639     memset(&DrvStatusEx, 0, sizeof(DrvStatusEx));
8640     VERSION_COMPATIBLE_CHECK(pDrvStatusEx, DrvStatusEx, u16CopiedLength, u32ApiStatusEx_Version, u16ApiStatusEX_Length, API_STATUS_EX_VERSION);
8641 
8642     DrvStatusEx.u32ApiStatusEx_Version = API_STATUS_EX_VERSION; //Return the actual version of the returned value for APP to use
8643     DrvStatusEx.u16ApiStatusEX_Length = u16CopiedLength; //Return the actual length of the returned value for APP to know whick info is valid
8644 
8645     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8646     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8647     _XC_ENTRY(pInstance);
8648     //----------------------
8649     // Customer setting
8650     //----------------------
8651     DrvStatusEx.enInputSourceType = gSrcInfo[eWindow].enInputSourceType;
8652 
8653     //----------------------
8654     // Window
8655     //----------------------
8656     memcpy(&DrvStatusEx.stCapWin, &gSrcInfo[eWindow].stCapWin, sizeof(MS_WINDOW_TYPE));
8657     memcpy(&DrvStatusEx.stCropWin, &gSrcInfo[eWindow].stCropWin, sizeof(MS_WINDOW_TYPE));
8658     /* real crop win in memory */
8659     memcpy(&DrvStatusEx.ScaledCropWin, &gSrcInfo[eWindow].ScaledCropWin, sizeof(MS_WINDOW_TYPE));
8660     //Assign display window for AP layer
8661     memcpy(&DrvStatusEx.stDispWin, &gSrcInfo[eWindow].stDispWin, sizeof(MS_WINDOW_TYPE));
8662 
8663     //stXCPanelDefaultTiming.u16HStart only be set to MAIN_WINDOW
8664     //Sub window do not set this value, use MAIN_WINDOW if set sub.
8665     if(DrvStatusEx.stDispWin.x >= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16HStart)
8666     {
8667         DrvStatusEx.stDispWin.x -= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16HStart;
8668     }
8669     if(DrvStatusEx.stDispWin.y >= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16VStart)
8670     {
8671         DrvStatusEx.stDispWin.y -= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16VStart;
8672     }
8673 
8674     if(MDrv_XC_Is2K2KToFrc(pInstance))
8675     {
8676         DrvStatusEx.stDispWin.x = DrvStatusEx.stDispWin.x * 2;
8677         DrvStatusEx.stDispWin.width= DrvStatusEx.stDispWin.width * 2;
8678     }
8679 
8680     //----------------------
8681     // Timing
8682     //----------------------
8683     DrvStatusEx.bInterlace = gSrcInfo[eWindow].bInterlace;
8684     DrvStatusEx.bHDuplicate = gSrcInfo[eWindow].bHDuplicate;
8685     DrvStatusEx.u16InputVFreq = gSrcInfo[eWindow].u16InputVFreq;
8686     DrvStatusEx.u16InputVTotal = gSrcInfo[eWindow].u16InputVTotal;
8687     DrvStatusEx.u16DefaultHtotal = gSrcInfo[eWindow].u16DefaultHtotal;
8688     DrvStatusEx.u8DefaultPhase = (MS_U8)gSrcInfo[eWindow].u16DefaultPhase;
8689     DrvStatusEx.u16DefaultPhase = gSrcInfo[eWindow].u16DefaultPhase;
8690 
8691     //----------------------
8692     // customized scaling
8693     //----------------------
8694     DrvStatusEx.bHCusScaling = gSrcInfo[eWindow].bHCusScaling;
8695     DrvStatusEx.u16HCusScalingSrc = gSrcInfo[eWindow].u16HCusScalingSrc;
8696     DrvStatusEx.u16HCusScalingDst = gSrcInfo[eWindow].u16HCusScalingDst;
8697     DrvStatusEx.bVCusScaling = gSrcInfo[eWindow].bVCusScaling;
8698     DrvStatusEx.u16VCusScalingSrc = gSrcInfo[eWindow].u16VCusScalingSrc;
8699     DrvStatusEx.u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst;
8700 
8701     DrvStatusEx.bPreHCusScaling = gSrcInfo[eWindow].Status2.bPreHCusScaling;
8702     DrvStatusEx.u16PreHCusScalingSrc = gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc;
8703     DrvStatusEx.u16PreHCusScalingDst = gSrcInfo[eWindow].Status2.u16PreHCusScalingDst;
8704     DrvStatusEx.bPreVCusScaling = gSrcInfo[eWindow].Status2.bPreVCusScaling;
8705     DrvStatusEx.u16PreVCusScalingSrc = gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc;
8706     DrvStatusEx.u16PreVCusScalingDst = gSrcInfo[eWindow].Status2.u16PreVCusScalingDst;
8707 
8708     //--------------
8709     // 9 lattice
8710     //--------------
8711     DrvStatusEx.bDisplayNineLattice = gSrcInfo[eWindow].bDisplayNineLattice;
8712 
8713     //----------------------
8714     // XC internal setting
8715     //----------------------
8716 
8717     /* scaling ratio */
8718     DrvStatusEx.u16H_SizeAfterPreScaling = gSrcInfo[eWindow].u16H_SizeAfterPreScaling;
8719     DrvStatusEx.u16V_SizeAfterPreScaling = gSrcInfo[eWindow].u16V_SizeAfterPreScaling;
8720     DrvStatusEx.bPreV_ScalingDown = gSrcInfo[eWindow].bPreV_ScalingDown;
8721 
8722 
8723     /* others */
8724     DrvStatusEx.u32Op2DclkSet = gSrcInfo[eWindow].u32Op2DclkSet;
8725 
8726     /* Video screen status */
8727     DrvStatusEx.bBlackscreenEnabled = gSrcInfo[eWindow].bBlackscreenEnabled;
8728     DrvStatusEx.bBluescreenEnabled = gSrcInfo[eWindow].bBluescreenEnabled;
8729     DrvStatusEx.u16VideoDark = gSrcInfo[eWindow].u16VideoDark;
8730 
8731     DrvStatusEx.u16V_Length = gSrcInfo[eWindow].u16V_Length;
8732     DrvStatusEx.u16BytePerWord = gSrcInfo[eWindow].u16BytePerWord;
8733     DrvStatusEx.u16OffsetPixelAlignment = gSrcInfo[eWindow].u16OffsetPixelAlignment;
8734     DrvStatusEx.u8BitPerPixel = gSrcInfo[eWindow].u8BitPerPixel;
8735 
8736     DrvStatusEx.eDeInterlaceMode = gSrcInfo[eWindow].eDeInterlaceMode;
8737     DrvStatusEx.u8DelayLines = gSrcInfo[eWindow].u8DelayLines;
8738     DrvStatusEx.bMemFmt422 = gSrcInfo[eWindow].bMemFmt422;
8739     DrvStatusEx.eMemory_FMT = gSrcInfo[eWindow].eMemory_FMT;
8740 
8741     DrvStatusEx.bForceNRoff = gSrcInfo[eWindow].bForceNRoff;
8742     DrvStatusEx.bEn3DNR = gSrcInfo[eWindow].bEn3DNR;
8743     DrvStatusEx.bUseYUVSpace = gSrcInfo[eWindow].bUseYUVSpace;
8744     DrvStatusEx.bMemYUVFmt = gSrcInfo[eWindow].bMemYUVFmt;
8745     DrvStatusEx.bForceRGBin = gSrcInfo[eWindow].bForceRGBin;
8746     DrvStatusEx.bLinearMode = gSrcInfo[eWindow].bLinearMode;
8747 
8748     // frame lock related
8749     // only main can select FB/FBL because panel output timing depends on main window, sub will always use FB
8750     DrvStatusEx.bFBL = gSrcInfo[eWindow].bFBL;
8751     DrvStatusEx.bFastFrameLock = gSrcInfo[eWindow].bFastFrameLock;
8752     DrvStatusEx.bDoneFPLL = MDrv_Scaler_GetFPLLDoneStatus(pInstance);
8753     DrvStatusEx.bEnableFPLL = gSrcInfo[eWindow].bEnableFPLL;
8754     DrvStatusEx.bFPLL_LOCK = gSrcInfo[eWindow].bFPLL_LOCK;
8755 
8756     // Capture_Memory
8757     DrvStatusEx.u32IPMBase0 = gSrcInfo[eWindow].u32IPMBase0;
8758     DrvStatusEx.u32IPMBase1 = gSrcInfo[eWindow].u32IPMBase1;
8759     DrvStatusEx.u32IPMBase2 = gSrcInfo[eWindow].u32IPMBase2;
8760     DrvStatusEx.u16IPMOffset = gSrcInfo[eWindow].u16IPMOffset;
8761     DrvStatusEx.u16IPMFetch = gSrcInfo[eWindow].u16IPMFetch;
8762 
8763     //HSizeChangedBeyondPQ status
8764     DrvStatusEx.bPQSetHSD = !(gSrcInfo[eWindow].bHCusScaling || gSrcInfo[eWindow].Status2.bPreHCusScaling
8765                                 || MDrv_XC_GetHSizeChangeManuallyFlag(pInstance, eWindow));
8766 #ifndef DISABLE_3D_FUNCTION
8767     DrvStatusEx.bIsHWDepthAdjSupported = MDrv_XC_3D_IsHWDepthAdjSupported(pInstance, MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow),
8768                                                                           MDrv_XC_Get_3D_Output_Mode(pInstance),
8769                                                                           eWindow);
8770     DrvStatusEx.bIs2LineMode = MDrv_SC_3D_Is2TapModeSupportedFormat(pInstance, &gSrcInfo[eWindow], eWindow);
8771 #else
8772     DrvStatusEx.bIsHWDepthAdjSupported = FALSE;
8773     DrvStatusEx.bIs2LineMode = FALSE;
8774 #endif
8775     DrvStatusEx.bIsPNLYUVOutput = MDrv_XC_IsPNLYUVOutput(pInstance);
8776 
8777     //if inputSource is HDMI, get the HDMI pixel repetition info.
8778     if(IsSrcTypeHDMI(DrvStatusEx.enInputSourceType))
8779     {
8780         DrvStatusEx.u8HDMIPixelRepetition = MDrv_HDMI_avi_infoframe_info(_BYTE_5) & 0x0F;
8781     }
8782     else
8783     {
8784         DrvStatusEx.u8HDMIPixelRepetition = 0;
8785     }
8786 
8787     // FRCM memory info
8788     DrvStatusEx.u32FRCMBase0 = MDrv_XC_Get_FRCM_W_BaseAddr(pInstance,0,eWindow);
8789     DrvStatusEx.u32FRCMBase1 = MDrv_XC_Get_FRCM_W_BaseAddr(pInstance,1,eWindow);
8790     DrvStatusEx.u32FRCMBase2 = MDrv_XC_Get_FRCM_W_BaseAddr(pInstance,2,eWindow);
8791 
8792     #ifdef UFO_XC_ZORDER
8793     //VIDEO and the relative position of OSD.
8794     if(E_APIXC_RET_OK != MDrv_SC_GetVideoOnOSD(pInstance, &(DrvStatusEx.enZOrderIndex), eWindow) )
8795     {
8796         printf("%s, %d, MDrv_SC_GetVideoOnOSD fail!\n", __FUNCTION__, __LINE__);
8797     }
8798     #endif
8799 
8800     // FSC && FRC settings
8801     #if FRC_INSIDE
8802         #if (HW_DESIGN_4K2K_VER == 6) // For Manhattan, FSC+FRC
8803             DrvStatusEx.bFSCEnabled = pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled;
8804             DrvStatusEx.bFRCEnabled = pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled;
8805         #else
8806             DrvStatusEx.bFSCEnabled = FALSE;
8807             DrvStatusEx.bFRCEnabled = FALSE;
8808         #endif
8809     #else
8810         DrvStatusEx.bFSCEnabled = FALSE;
8811         DrvStatusEx.bFRCEnabled = FALSE;
8812     #endif
8813     DrvStatusEx.u16PanelInterfaceType= (MS_U16)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
8814     _XC_RETURN(pInstance);
8815     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8816     //shorter Ap structure with longer lib structure, we should handle it to avoid access-violation.
8817     memcpy(pDrvStatusEx, &DrvStatusEx, u16CopiedLength);
8818 
8819     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8820 
8821     return u16CopiedLength;
8822 }
8823 
MApi_XC_GetStatusEx(XC_ApiStatusEx * pDrvStatusEx,SCALER_WIN eWindow)8824 MS_U16 MApi_XC_GetStatusEx(XC_ApiStatusEx *pDrvStatusEx, SCALER_WIN eWindow)
8825 {
8826     if (pu32XCInst == NULL)
8827     {
8828         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8829         return 0;
8830     }
8831 
8832     stXC_GET_STATUS_EX XCArgs;
8833     XCArgs.pDrvStatusEx = pDrvStatusEx;
8834     XCArgs.eWindow = eWindow;
8835     XCArgs.u16ReturnValue = 0;
8836 
8837     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_STATUS_EX, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
8838     {
8839         printf("Obtain XC engine fail\n");
8840         return 0;
8841     }
8842     else
8843     {
8844         return XCArgs.u16ReturnValue;
8845     }
8846 }
8847 
8848 //-------------------------------------------------------------------------------------------------
8849 /// Get XC Status of specific window(Main/Sub)
8850 /// @param  pDrvStatus                  \b OUT: store the status
8851 /// @param  eWindow                     \b IN: which window(Main/Sub) is going to get status
8852 /// @return @ref MS_BOOL
8853 //-------------------------------------------------------------------------------------------------
MDrv_XC_GetStatus(void * pInstance,XC_ApiStatus * pDrvStatus,SCALER_WIN eWindow)8854 MS_BOOL MDrv_XC_GetStatus(void *pInstance, XC_ApiStatus *pDrvStatus, SCALER_WIN eWindow)
8855 {
8856     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
8857     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8858     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8859 
8860     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8861     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8862     //----------------------
8863     // Customer setting
8864     //----------------------
8865     pDrvStatus->enInputSourceType = gSrcInfo[eWindow].enInputSourceType;
8866 
8867     //----------------------
8868     // Window
8869     //----------------------
8870     memcpy(&pDrvStatus->stCapWin, &gSrcInfo[eWindow].stCapWin, sizeof(MS_WINDOW_TYPE));
8871     memcpy(&pDrvStatus->stCropWin, &gSrcInfo[eWindow].stCropWin, sizeof(MS_WINDOW_TYPE));
8872     /* real crop win in memory */
8873     memcpy(&pDrvStatus->ScaledCropWin, &gSrcInfo[eWindow].ScaledCropWin, sizeof(MS_WINDOW_TYPE));
8874     //Assign display window for AP layer
8875     memcpy(&pDrvStatus->stDispWin, &gSrcInfo[eWindow].stDispWin, sizeof(MS_WINDOW_TYPE));
8876 
8877     //stXCPanelDefaultTiming.u16HStart only be set to MAIN_WINDOW
8878     //Sub window do not set this value, use MAIN_WINDOW if set sub.
8879     if(pDrvStatus->stDispWin.x >= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16HStart)
8880     {
8881         pDrvStatus->stDispWin.x -= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16HStart;
8882     }
8883     if(pDrvStatus->stDispWin.y >= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16VStart)
8884     {
8885         pDrvStatus->stDispWin.y -= gSrcInfo[MAIN_WINDOW].Status2.stXCPanelDefaultTiming.u16VStart;
8886     }
8887 
8888     //----------------------
8889     // Timing
8890     //----------------------
8891     pDrvStatus->bInterlace = gSrcInfo[eWindow].bInterlace;
8892     pDrvStatus->bHDuplicate = gSrcInfo[eWindow].bHDuplicate;
8893     pDrvStatus->u16InputVFreq = gSrcInfo[eWindow].u16InputVFreq;
8894     pDrvStatus->u16InputVTotal = gSrcInfo[eWindow].u16InputVTotal;
8895     pDrvStatus->u16DefaultHtotal = gSrcInfo[eWindow].u16DefaultHtotal;
8896     pDrvStatus->u8DefaultPhase = (MS_U8)gSrcInfo[eWindow].u16DefaultPhase;
8897 
8898     //----------------------
8899     // customized scaling
8900     //----------------------
8901     pDrvStatus->bHCusScaling = gSrcInfo[eWindow].bHCusScaling;
8902     pDrvStatus->u16HCusScalingSrc = gSrcInfo[eWindow].u16HCusScalingSrc;
8903     pDrvStatus->u16HCusScalingDst = gSrcInfo[eWindow].u16HCusScalingDst;
8904     pDrvStatus->bVCusScaling = gSrcInfo[eWindow].bVCusScaling;
8905     pDrvStatus->u16VCusScalingSrc = gSrcInfo[eWindow].u16VCusScalingSrc;
8906     pDrvStatus->u16VCusScalingDst = gSrcInfo[eWindow].u16VCusScalingDst;
8907 
8908     //--------------
8909     // 9 lattice
8910     //--------------
8911     pDrvStatus->bDisplayNineLattice = gSrcInfo[eWindow].bDisplayNineLattice;
8912 
8913     //----------------------
8914     // XC internal setting
8915     //----------------------
8916 
8917     /* scaling ratio */
8918     pDrvStatus->u16H_SizeAfterPreScaling = gSrcInfo[eWindow].u16H_SizeAfterPreScaling;
8919     pDrvStatus->u16V_SizeAfterPreScaling = gSrcInfo[eWindow].u16V_SizeAfterPreScaling;
8920     pDrvStatus->bPreV_ScalingDown = gSrcInfo[eWindow].bPreV_ScalingDown;
8921 
8922 
8923     /* others */
8924     pDrvStatus->u32Op2DclkSet = gSrcInfo[eWindow].u32Op2DclkSet;
8925 
8926     /* Video screen status */
8927     pDrvStatus->bBlackscreenEnabled = gSrcInfo[eWindow].bBlackscreenEnabled;
8928     pDrvStatus->bBluescreenEnabled = gSrcInfo[eWindow].bBluescreenEnabled;
8929     pDrvStatus->u16VideoDark = gSrcInfo[eWindow].u16VideoDark;
8930 
8931     pDrvStatus->u16V_Length = gSrcInfo[eWindow].u16V_Length;
8932     pDrvStatus->u16BytePerWord = gSrcInfo[eWindow].u16BytePerWord;
8933     pDrvStatus->u16OffsetPixelAlignment = gSrcInfo[eWindow].u16OffsetPixelAlignment;
8934     pDrvStatus->u8BitPerPixel = gSrcInfo[eWindow].u8BitPerPixel;
8935 
8936     pDrvStatus->eDeInterlaceMode = gSrcInfo[eWindow].eDeInterlaceMode;
8937     pDrvStatus->u8DelayLines = gSrcInfo[eWindow].u8DelayLines;
8938     pDrvStatus->bMemFmt422 = gSrcInfo[eWindow].bMemFmt422;
8939     pDrvStatus->eMemory_FMT = gSrcInfo[eWindow].eMemory_FMT;
8940 
8941     pDrvStatus->bForceNRoff = gSrcInfo[eWindow].bForceNRoff;
8942     pDrvStatus->bEn3DNR = gSrcInfo[eWindow].bEn3DNR;
8943     pDrvStatus->bUseYUVSpace = gSrcInfo[eWindow].bUseYUVSpace;
8944     pDrvStatus->bMemYUVFmt = gSrcInfo[eWindow].bMemYUVFmt;
8945     pDrvStatus->bForceRGBin = gSrcInfo[eWindow].bForceRGBin;
8946     pDrvStatus->bLinearMode = gSrcInfo[eWindow].bLinearMode;
8947 
8948     // frame lock related
8949     // only main can select FB/FBL because panel output timing depends on main window, sub will always use FB
8950     pDrvStatus->bFBL = gSrcInfo[eWindow].bFBL;
8951     pDrvStatus->bFastFrameLock = gSrcInfo[eWindow].bFastFrameLock;
8952     pDrvStatus->bDoneFPLL = MDrv_Scaler_GetFPLLDoneStatus(pInstance);
8953     pDrvStatus->bEnableFPLL = gSrcInfo[eWindow].bEnableFPLL;
8954     pDrvStatus->bFPLL_LOCK = gSrcInfo[eWindow].bFPLL_LOCK;
8955 
8956     // Capture_Memory
8957     pDrvStatus->u32IPMBase0 = gSrcInfo[eWindow].u32IPMBase0;
8958     pDrvStatus->u32IPMBase1 = gSrcInfo[eWindow].u32IPMBase1;
8959     pDrvStatus->u32IPMBase2 = gSrcInfo[eWindow].u32IPMBase2;
8960     pDrvStatus->u16IPMOffset = gSrcInfo[eWindow].u16IPMOffset;
8961     pDrvStatus->u16IPMFetch = gSrcInfo[eWindow].u16IPMFetch;
8962 
8963     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
8964 
8965     return TRUE;
8966 }
8967 
MApi_XC_GetStatus_U2(void * pInstance,XC_ApiStatus * pDrvStatus,SCALER_WIN eWindow)8968 MS_BOOL MApi_XC_GetStatus_U2(void* pInstance, XC_ApiStatus *pDrvStatus, SCALER_WIN eWindow)
8969 {
8970     MS_BOOL bReturn = FALSE;
8971     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8972     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8973     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
8974     _XC_ENTRY(pInstance);
8975     bReturn = MDrv_XC_GetStatus(pInstance, pDrvStatus, eWindow);
8976     if(MDrv_XC_Is2K2KToFrc(pInstance))
8977     {
8978         pDrvStatus->stDispWin.x = pDrvStatus->stDispWin.x * 2;
8979         pDrvStatus->stDispWin.width= pDrvStatus->stDispWin.width * 2;
8980     }
8981     _XC_RETURN(pInstance);
8982     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
8983     return bReturn;
8984 }
8985 
MApi_XC_GetStatus(XC_ApiStatus * pDrvStatus,SCALER_WIN eWindow)8986 MS_BOOL MApi_XC_GetStatus(XC_ApiStatus *pDrvStatus, SCALER_WIN eWindow)
8987 {
8988     if (pu32XCInst == NULL)
8989     {
8990         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
8991         return FALSE;
8992     }
8993 
8994     stXC_GET_STATUS XCArgs;
8995     XCArgs.pDrvStatus = pDrvStatus;
8996     XCArgs.eWindow = eWindow;
8997     XCArgs.bReturnValue = FALSE;
8998 
8999     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_STATUS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9000     {
9001         printf("Obtain XC engine fail\n");
9002         return FALSE;
9003     }
9004     else
9005     {
9006         return XCArgs.bReturnValue;
9007     }
9008 }
9009 
MApi_XC_GetStatusNodelay_U2(void * pInstance,ST_XC_APISTATUSNODELAY * pDrvStatus,SCALER_WIN eWindow)9010 MS_BOOL MApi_XC_GetStatusNodelay_U2(void* pInstance, ST_XC_APISTATUSNODELAY *pDrvStatus, SCALER_WIN eWindow)
9011 {
9012     MS_U16 u16CopiedLength = sizeof(ST_XC_APISTATUSNODELAY);
9013     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9014 #if 0
9015     if((NULL == pDrvStatus) || (pDrvStatus->u16ApiStatusEX_Length == 0))
9016     {
9017         //We consider compatible operation from version2 , so reject the info init when version invalid
9018         XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MApi_XC_GetStatusEx: Null paramter or Wrong u16ApiStatusEX_Length!!\n")
9019 
9020         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9021         return 0;
9022     }
9023 
9024     // the version control is coming in with version 1
9025     if(pDrvStatus->u32ApiStatusEx_Version < 1)
9026     {
9027         //We consider compatible operation from version1 , so reject the info init when version invalid
9028         XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MApi_XC_GetStatusEx: please check your u32ApiStatusEx_Version, it should not set to 0!!\n")
9029         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9030 
9031         return 0;
9032     }
9033 #endif
9034     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9035     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9036     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9037 
9038     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9039     //----------------------
9040     // Customer setting
9041     //----------------------
9042     pDrvStatus->enInputSourceType = gSrcInfo[eWindow].stStatusnodelay.enInputSourceType;
9043 
9044     //----------------------
9045     // Window
9046     //----------------------
9047     //Assign display window for AP layer
9048     memcpy(&pDrvStatus->stDispWin, &gSrcInfo[eWindow].stStatusnodelay.stDispWin, sizeof(MS_WINDOW_TYPE));
9049 
9050     if(pDrvStatus->stDispWin.x >= gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16HStart)
9051     {
9052         pDrvStatus->stDispWin.x -= gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16HStart;
9053     }
9054     if(pDrvStatus->stDispWin.y >= gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16VStart)
9055     {
9056         pDrvStatus->stDispWin.y -= gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16VStart;
9057     }
9058 
9059 
9060     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9061 
9062     return u16CopiedLength;
9063 }
9064 
MApi_XC_GetStatusNodelay(ST_XC_APISTATUSNODELAY * pDrvStatus,SCALER_WIN eWindow)9065 MS_BOOL MApi_XC_GetStatusNodelay(ST_XC_APISTATUSNODELAY *pDrvStatus, SCALER_WIN eWindow)
9066 {
9067     if (pu32XCInst == NULL)
9068     {
9069         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9070         return FALSE;
9071     }
9072 
9073     ST_XC_GET_STATUS_NODELAY XCArgs;
9074     XCArgs.pDrvStatus = pDrvStatus;
9075     XCArgs.eWindow = eWindow;
9076     XCArgs.u16ReturnValue = 0;
9077 
9078     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_STATUS_NODELAY, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9079     {
9080         printf("Obtain XC engine fail\n");
9081         return FALSE;
9082     }
9083     else
9084     {
9085         return XCArgs.u16ReturnValue;
9086     }
9087 }
9088 
9089 //-------------------------------------------------------------------------------------------------
9090 /// Set XC debug level
9091 /// @param  u16DbgSwitch                \b IN: turn on/off debug switch
9092 //-------------------------------------------------------------------------------------------------
MApi_XC_SetDbgLevel_U2(void * pInstance,MS_U16 u16DbgSwitch)9093 MS_BOOL MApi_XC_SetDbgLevel_U2(void* pInstance, MS_U16 u16DbgSwitch)
9094 {
9095     _u16XCDbgSwitch_InternalUseOnly = u16DbgSwitch;
9096 
9097     return TRUE;
9098 }
9099 
MApi_XC_SetDbgLevel(MS_U16 u16DbgSwitch)9100 MS_BOOL MApi_XC_SetDbgLevel(MS_U16 u16DbgSwitch)
9101 {
9102     XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
9103     INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
9104 
9105     if (pu32XCInst == NULL)
9106     {
9107         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
9108         {
9109             printf("UtopiaOpen XC failed\n");
9110             return FALSE;
9111         }
9112     }
9113 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
9114      if (pu32XCInst_1 == NULL)
9115      {
9116         stXCInstantAttribute.u32DeviceID = 1;
9117         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
9118         {
9119             printf("UtopiaOpen XC failed\n");
9120             return E_APIXC_RET_FAIL;
9121         }
9122       }
9123 #endif
9124     stXC_SET_DBG_LEVEL XCArgs;
9125     XCArgs.u16DbgSwitch = u16DbgSwitch;
9126     XCArgs.bReturnValue = FALSE;
9127 
9128     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_DBG_LEVEL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9129     {
9130         printf("Obtain XC engine fail\n");
9131         return FALSE;
9132     }
9133     else
9134     {
9135         return XCArgs.bReturnValue;
9136     }
9137 }
9138 
9139 //-------------------------------------------------------------------------------------------------
9140 /// Get scaler output vertical frequency
9141 /// @return @ref MS_U16 return output vertical frequency x 100
9142 //-------------------------------------------------------------------------------------------------
MApi_XC_GetOutputVFreqX100_U2(void * pInstance)9143 MS_U16 MApi_XC_GetOutputVFreqX100_U2(void* pInstance)
9144 {
9145     MS_U16 u16OutputVfreqX100;
9146     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9147     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9148     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9149     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9150     u16OutputVfreqX100 = MDrv_SC_GetOutputVFreqX100(pInstance);
9151     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9152     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9153     return u16OutputVfreqX100;
9154 }
9155 
MApi_XC_GetOutputVFreqX100(void)9156 MS_U16 MApi_XC_GetOutputVFreqX100(void)
9157 {
9158     if (pu32XCInst == NULL)
9159     {
9160         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9161         return 0;
9162     }
9163 
9164     stXC_GET_OUTPUT_VFREQX100 XCArgs;
9165     XCArgs.u16ReturnValue = 0;
9166 
9167     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_OUTPUT_VFREQX100, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9168     {
9169         printf("Obtain XC engine fail\n");
9170         return 0;
9171     }
9172     else
9173     {
9174         return XCArgs.u16ReturnValue;
9175     }
9176 }
9177 
9178 //-------------------------------------------------------------------------------------------------
9179 /// Get OP1 output vertical frequency
9180 /// @return @ref MS_U16 return output vertical frequency x 100
9181 //-------------------------------------------------------------------------------------------------
MApi_XC_GetOP1OutputVFreqX100_U2(void * pInstance)9182 MS_U16 MApi_XC_GetOP1OutputVFreqX100_U2(void* pInstance)
9183 {
9184     MS_U16 u16OutputVfreqX100;
9185     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9186     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9187     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9188     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9189     u16OutputVfreqX100 = MDrv_SC_GetOP1OutputVFreqX100(pInstance);
9190     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9191     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9192     return u16OutputVfreqX100;
9193 }
9194 
MApi_XC_GetOP1OutputVFreqX100(void)9195 MS_U16 MApi_XC_GetOP1OutputVFreqX100(void)
9196 {
9197     if (pu32XCInst == NULL)
9198     {
9199         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9200         return 0;
9201     }
9202 
9203     stXC_GET_OP1_OUTPUT_VFREQX100 XCArgs;
9204     XCArgs.u16ReturnValue = 0;
9205 
9206     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_OP1_OUTPUT_VFREQX100, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9207     {
9208         printf("Obtain XC engine fail\n");
9209         return 0;
9210     }
9211     else
9212     {
9213         return XCArgs.u16ReturnValue;
9214     }
9215 }
9216 
9217 //-------------------------------------------------------------------------------------------------
9218 /// set NR on/off
9219 /// @param bEn              \b IN: enable/disable NR
9220 /// @param eWindow          \b IN: which window(Main/Sub) is going to get status
9221 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_NR_U2(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)9222 void MApi_XC_Set_NR_U2(void* pInstance, MS_BOOL bEn, SCALER_WIN eWindow)
9223 {
9224 #if TEST_NEW_DYNAMIC_NR
9225     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9226 
9227     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9228     _XC_ENTRY(pInstance);
9229     MDrv_Scaler_EnableNR(pInstance, bEn, eWindow);
9230     _XC_RETURN(pInstance);
9231     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9232     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9233 #endif
9234 }
9235 
MApi_XC_Set_NR(MS_BOOL bEn,SCALER_WIN eWindow)9236 void MApi_XC_Set_NR(MS_BOOL bEn, SCALER_WIN eWindow)
9237 {
9238     if (pu32XCInst == NULL)
9239     {
9240         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9241         return;
9242     }
9243 
9244     stXC_SET_NR XCArgs;
9245     XCArgs.bEn = bEn;
9246     XCArgs.eWindow = eWindow;
9247 
9248     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_NR, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9249     {
9250         printf("Obtain XC engine fail\n");
9251         return;
9252     }
9253     else
9254     {
9255         return;
9256     }
9257 }
9258 #ifndef MSOS_TYPE_LINUX_KERNEL
9259 extern __attribute__((weak)) void MDrv_PQ_DesideSrcType(PQ_WIN eWindow, PQ_INPUT_SOURCE_TYPE enInputSourceType);
9260 extern __attribute__((weak)) void MDrv_PQ_DisableFilmMode(PQ_WIN eWindow, MS_BOOL bOn);
9261 extern __attribute__((weak)) MS_BOOL MDrv_PQ_LoadScalingTable(PQ_WIN eWindow,
9262                                                                 MS_U8 eXRuleType,
9263                                                                 MS_BOOL bPreV_ScalingDown,
9264                                                                 MS_BOOL bInterlace,
9265                                                                 MS_BOOL bColorSpaceYUV,
9266                                                                 MS_U16 u16InputSize,
9267                                                                 MS_U16 u16SizeAfterScaling);
9268 extern __attribute__((weak)) void MDrv_PQ_Set420upsampling(PQ_WIN eWindow,
9269                                                             MS_BOOL bFBL,
9270                                                             MS_BOOL bPreV_ScalingDown,
9271                                                             MS_U16 u16V_CropStart);
9272 extern __attribute__((weak)) MS_BOOL MDrv_PQ_SetCSC(PQ_WIN eWindow, PQ_FOURCE_COLOR_FMT enForceColor);
9273 extern __attribute__((weak)) MS_BOOL MDrv_PQ_Get_MemYUVFmt(PQ_WIN eWindow, PQ_FOURCE_COLOR_FMT enForceColor);
9274 extern __attribute__((weak)) PQ_DEINTERLACE_MODE MDrv_PQ_SetMemFormat(PQ_WIN eWindow, MS_BOOL bMemFmt422, MS_BOOL bFBL, MS_U8 *pu8BitsPerPixel);
9275 extern __attribute__((weak)) void MDrv_PQ_Set_ModeInfo(PQ_WIN eWindow, PQ_INPUT_SOURCE_TYPE enInputSourceType, MS_PQ_Mode_Info *pstPQModeInfo);
9276 extern __attribute__((weak)) MS_BOOL MDrv_PQ_IOCTL(PQ_WIN eWindow, MS_U32 u32Flag, void *pBuf, MS_U32 u32BufSize);
9277 #endif
9278 //-------------------------------------------------------------------------------------------------
9279 /// Create a function for PQ in SC.
9280 /// @param  PQ_Function_Info               \b IN: the information of the function
9281 /// @param  u32InitDataLen          \b IN: the length of the PQ_Function_Info
9282 //-------------------------------------------------------------------------------------------------
MApi_XC_PQ_LoadFunction_U2(void * pInstance,PQ_Function_Info * function_Info,MS_U32 u32InitDataLen)9283 void MApi_XC_PQ_LoadFunction_U2(void* pInstance, PQ_Function_Info* function_Info , MS_U32 u32InitDataLen)
9284 {
9285     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9286     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9287     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9288 
9289 #if (HW_DESIGN_4K2K_VER == 7)
9290 //Kano sc1 do not load pq function now
9291     if(psXCInstPri->u32DeviceID == 1)
9292     {
9293         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype = NULL;
9294         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_disable_filmmode = NULL;
9295         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_load_scalingtable = NULL;
9296         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling = NULL;
9297         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc = NULL;
9298         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt= NULL;
9299         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat = NULL;
9300         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo = NULL;
9301         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl = NULL;
9302         return;
9303     }
9304 #endif
9305 
9306         // Path create.
9307 #ifdef MSOS_TYPE_LINUX_KERNEL
9308         UNUSED(function_Info);
9309 #ifndef DISABLE_PQ_FUNCTION
9310         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype = MDrv_PQ_DesideSrcType;
9311         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_disable_filmmode = MDrv_PQ_DisableFilmMode;
9312         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_load_scalingtable = MDrv_PQ_LoadScalingTable;
9313         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling = MDrv_PQ_Set420upsampling;
9314         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc = MDrv_PQ_SetCSC;
9315         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt= MDrv_PQ_Get_MemYUVFmt;
9316         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat = MDrv_PQ_SetMemFormat;
9317         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo = MDrv_PQ_Set_ModeInfo;
9318         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl = MDrv_PQ_IOCTL;
9319 #endif
9320 #else
9321         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype = function_Info->pq_deside_srctype;
9322         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_disable_filmmode = function_Info->pq_disable_filmmode;
9323         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_load_scalingtable = function_Info->pq_load_scalingtable;
9324         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling = function_Info->pq_set_420upsampling;
9325         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc = function_Info->pq_set_csc;
9326         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt= function_Info->pq_get_memyuvfmt;
9327         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat = function_Info->pq_set_memformat;
9328         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo = function_Info->pq_set_modeInfo;
9329         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl = function_Info->pq_ioctl;
9330 #endif
9331 
9332 #ifdef ENABLE_TV_SC2_PQ
9333         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_deside_srctype_ex = function_Info->pq_deside_srctype_ex;
9334         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_disable_filmmode_ex = function_Info->pq_disable_filmmode_ex;
9335         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_load_scalingtable_ex = function_Info->pq_load_scalingtable_ex;
9336         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_420upsampling_ex = function_Info->pq_set_420upsampling_ex;
9337         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_csc_ex = function_Info->pq_set_csc_ex;
9338         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_get_memyuvfmt_ex = function_Info->pq_get_memyuvfmt_ex;
9339         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_memformat_ex = function_Info->pq_set_memformat_ex;
9340         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_set_modeInfo_ex = function_Info->pq_set_modeInfo_ex;
9341         s_PQ_Function_Info[psXCInstPri->u32DeviceID].pq_ioctl_ex = function_Info->pq_ioctl_ex;
9342 #endif
9343 
9344     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9345 }
9346 
MApi_XC_PQ_LoadFunction(PQ_Function_Info * function_Info,MS_U32 u32InitDataLen)9347 void MApi_XC_PQ_LoadFunction(PQ_Function_Info* function_Info , MS_U32 u32InitDataLen)
9348 {
9349     if (pu32XCInst == NULL)
9350     {
9351         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
9352         {
9353             printf("UtopiaOpen XC failed\n");
9354             return;
9355         }
9356     }
9357 
9358     stXC_SET_PQ_LOADFUNCTION XCArgs;
9359     XCArgs.function_Info = function_Info;
9360     XCArgs.u32InitDataLen = u32InitDataLen;
9361 
9362     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_PQ_LOADFUNCTION, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9363     {
9364         printf("Obtain XC engine fail\n");
9365         return;
9366     }
9367     else
9368     {
9369         return;
9370     }
9371 }
9372 
MApi_XC_SetOSD2VEMode_U2(void * pInstance,EN_VOP_SEL_OSD_XC2VE_MUX eVOPSelOSD_MUX)9373 void MApi_XC_SetOSD2VEMode_U2(void* pInstance, EN_VOP_SEL_OSD_XC2VE_MUX  eVOPSelOSD_MUX)
9374 {
9375     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9376 
9377     MDrv_XC_SetOSD2VEmode(pInstance, eVOPSelOSD_MUX);
9378     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9379 }
9380 
MApi_XC_SetOSD2VEMode(EN_VOP_SEL_OSD_XC2VE_MUX eVOPSelOSD_MUX)9381 void MApi_XC_SetOSD2VEMode(EN_VOP_SEL_OSD_XC2VE_MUX  eVOPSelOSD_MUX)
9382 {
9383     if (pu32XCInst == NULL)
9384     {
9385         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9386         return;
9387     }
9388 
9389     stXC_SET_OSD2VEMODE XCArgs;
9390     XCArgs.eVOPSelOSD_MUX = eVOPSelOSD_MUX;
9391 
9392     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OSD2VEMODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9393     {
9394         printf("Obtain XC engine fail\n");
9395         return;
9396     }
9397     else
9398     {
9399         return;
9400     }
9401 }
9402 
MApi_XC_IP2_PreFilter_Enable_U2(void * pInstance,MS_BOOL bEnable)9403 void MApi_XC_IP2_PreFilter_Enable_U2(void* pInstance, MS_BOOL bEnable)
9404 {
9405     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9406 
9407     _XC_ENTRY(pInstance);
9408     MDrv_SC_IP2_PreFilter_Enable(pInstance, bEnable);
9409     _XC_RETURN(pInstance);
9410     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9411 }
9412 
MApi_XC_IP2_PreFilter_Enable(MS_BOOL bEnable)9413 void MApi_XC_IP2_PreFilter_Enable(MS_BOOL bEnable)
9414 {
9415     if (pu32XCInst == NULL)
9416     {
9417         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9418         return;
9419     }
9420 
9421     stXC_SET_IP2_PREFILTER_ENABLE XCArgs;
9422     XCArgs.bEnable = bEnable;
9423 
9424     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_IP2_PREFILTER_ENABLE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9425     {
9426         printf("Obtain XC engine fail\n");
9427         return;
9428     }
9429     else
9430     {
9431         return;
9432     }
9433 }
9434 
MApi_XC_KeepPixelPointerAppear_U2(void * pInstance,MS_BOOL bEnable)9435 void MApi_XC_KeepPixelPointerAppear_U2(void* pInstance, MS_BOOL bEnable)
9436 {
9437     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9438     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9439     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9440     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9441 
9442     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9443     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9444     _XC_ENTRY(pInstance);
9445     Hal_SC_enable_cursor_report(pInstance, bEnable);
9446     pXCResourcePrivate->stdrvXC_MVideo.s_bKeepPixelPointerAppear = bEnable;
9447     _XC_RETURN(pInstance);
9448     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9449     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9450 }
9451 
MApi_XC_KeepPixelPointerAppear(MS_BOOL bEnable)9452 void MApi_XC_KeepPixelPointerAppear(MS_BOOL bEnable)
9453 {
9454     if (pu32XCInst == NULL)
9455     {
9456         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9457         return;
9458     }
9459 
9460     stXC_SET_KEEP_PIXELPOINTER_APPEAR XCArgs;
9461     XCArgs.bEnable = bEnable;
9462 
9463     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_KEEP_PIXELPOINTER_APPEAR, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9464     {
9465         printf("Obtain XC engine fail\n");
9466         return;
9467     }
9468     else
9469     {
9470         return;
9471     }
9472 }
9473 
MApi_XC_Get_Pixel_RGB_U2(void * pInstance,XC_Get_Pixel_RGB * pData,SCALER_WIN eWindow)9474 E_APIXC_GET_PixelRGB_ReturnValue MApi_XC_Get_Pixel_RGB_U2(void* pInstance, XC_Get_Pixel_RGB *pData, SCALER_WIN eWindow)
9475 {
9476     E_APIXC_GET_PixelRGB_ReturnValue enRet;
9477 
9478     MS_WINDOW_TYPE DispWin;
9479     MS_WINDOW_TYPE DEWin;
9480     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9481     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9482     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9483     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9484     _XC_ENTRY(pInstance);
9485 
9486     Hal_SC_get_disp_de_window(pInstance, &DEWin);
9487 
9488     if(pData->enStage == E_XC_GET_PIXEL_STAGE_AFTER_DLC)
9489         MDrv_XC_get_dispwin_from_reg(pInstance, eWindow,&DispWin );
9490     else
9491         MDrv_XC_get_dispwin_from_reg(pInstance, MAIN_WINDOW, &DispWin);
9492 
9493     pData->u16x += DEWin.x;
9494     pData->u16y += DEWin.y;
9495 
9496     if(pData->u16x > DEWin.x + DEWin.width ||
9497        pData->u16y > DEWin.y + DEWin.height)
9498     {
9499         enRet = E_GET_PIXEL_RET_OUT_OF_RANGE;
9500     }
9501     else
9502     {
9503         if(Hal_SC_get_pixel_rgb(pInstance, pData))
9504             enRet = E_GET_PIXEL_RET_OK;
9505         else
9506             enRet = E_GET_PIXEL_RET_FAIL;
9507     }
9508 
9509     _XC_RETURN(pInstance);
9510     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9511     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9512     return enRet;
9513 }
9514 
MApi_XC_Get_Pixel_RGB(XC_Get_Pixel_RGB * pData,SCALER_WIN eWindow)9515 E_APIXC_GET_PixelRGB_ReturnValue MApi_XC_Get_Pixel_RGB(XC_Get_Pixel_RGB *pData, SCALER_WIN eWindow)
9516 {
9517     if (pu32XCInst == NULL)
9518     {
9519         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9520         return E_GET_PIXEL_RET_OUT_OF_RANGE;
9521     }
9522 
9523     stXC_GET_PIXELRGB XCArgs;
9524     XCArgs.pData = pData;
9525     XCArgs.eWindow = eWindow;
9526     XCArgs.eReturnValue = E_GET_PIXEL_RET_OUT_OF_RANGE;
9527 
9528     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_PIXELRGB, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9529     {
9530         printf("Obtain XC engine fail\n");
9531         return E_GET_PIXEL_RET_OUT_OF_RANGE;
9532     }
9533     else
9534     {
9535         return XCArgs.eReturnValue;
9536     }
9537 }
9538 
MApi_XC_ReportPixelInfo_U2(void * pInstance,MS_XC_REPORT_PIXELINFO * pstRepPixInfo)9539 MS_BOOL MApi_XC_ReportPixelInfo_U2(void* pInstance, MS_XC_REPORT_PIXELINFO *pstRepPixInfo)
9540 {
9541     MS_BOOL enRet = FALSE;
9542     MS_WINDOW_TYPE stDEWin;
9543     MS_WINDOW_TYPE stRepWin;
9544     memset(&stDEWin, 0, sizeof(MS_WINDOW_TYPE));
9545     memset(&stRepWin, 0, sizeof(MS_WINDOW_TYPE));
9546     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9547     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9548     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9549     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9550     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9551     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9552 
9553     if(NULL == pstRepPixInfo)
9554     {
9555         printf("MApi_XC_ReportPixelInfo: pstRepPixInfo is NULL!!\n");
9556         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9557         return FALSE;
9558     }
9559 
9560     _XC_ENTRY(pInstance);
9561 
9562     //backup
9563     stRepWin.x = pstRepPixInfo->u16XStart;
9564     stRepWin.width = pstRepPixInfo->u16XEnd - pstRepPixInfo->u16XStart + 1;
9565     stRepWin.y = pstRepPixInfo->u16YStart;
9566     stRepWin.height = pstRepPixInfo->u16YEnd - pstRepPixInfo->u16YStart + 1;
9567 
9568     Hal_SC_get_disp_de_window(pInstance, &stDEWin);
9569 
9570     if((pstRepPixInfo->u16XStart > pstRepPixInfo->u16XEnd)
9571         || (pstRepPixInfo->u16XStart >= stDEWin.width)
9572         || (pstRepPixInfo->u16XEnd >= stDEWin.width)
9573         || (pstRepPixInfo->u16YStart > pstRepPixInfo->u16YEnd)
9574         || (pstRepPixInfo->u16YStart >= stDEWin.height)
9575         || (pstRepPixInfo->u16YEnd >= stDEWin.height)
9576       )
9577     {
9578         printf("Attention! MApi_XC_ReportPixelInfo: Invalid Param! Report Window=(%u,%u,%u,%u), DE Window=(%u,%u,%u,%u)\n",
9579                 pstRepPixInfo->u16XStart, pstRepPixInfo->u16XEnd, pstRepPixInfo->u16YStart, pstRepPixInfo->u16YEnd,
9580                 stDEWin.x, stDEWin.x + stDEWin.width - 1, stDEWin.y, stDEWin.y + stDEWin.height - 1);
9581         _XC_RETURN(pInstance);
9582         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9583         return FALSE;
9584     }
9585 
9586     //add de
9587     /*printf("! MApi_XC_ReportPixelInfo: Report Window=(%u,%u,%u,%u), DE Window=(%u,%u,%u,%u)\n",
9588                 pstRepPixInfo->u16XStart, pstRepPixInfo->u16XEnd, pstRepPixInfo->u16YStart, pstRepPixInfo->u16YEnd,
9589                 stDEWin.x, stDEWin.x + stDEWin.width - 1, stDEWin.y, stDEWin.y + stDEWin.height - 1);*/
9590 
9591     //if H mirror
9592     if(IsHMirrorMode(MAIN_WINDOW) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, BIT(1)) == BIT(1)))
9593     {
9594         pstRepPixInfo->u16XStart = stDEWin.width - pstRepPixInfo->u16XEnd - 1;
9595         pstRepPixInfo->u16XEnd = stRepWin.width + pstRepPixInfo->u16XStart - 1;
9596     }
9597 
9598     pstRepPixInfo->u16XStart += stDEWin.x;
9599     pstRepPixInfo->u16XEnd += stDEWin.x;
9600 
9601     //if V mirror
9602     if(IsVMirrorMode(MAIN_WINDOW) || (MDrv_ReadRegBit(REG_MVOP_MIRROR, BIT(0)) == BIT(0)))
9603     {
9604         pstRepPixInfo->u16YStart = stDEWin.height - pstRepPixInfo->u16YEnd -1;
9605         pstRepPixInfo->u16YEnd = stRepWin.height + pstRepPixInfo->u16YStart - 1;
9606     }
9607 
9608     pstRepPixInfo->u16YStart += stDEWin.y;
9609     pstRepPixInfo->u16YEnd += stDEWin.y;
9610 
9611     /*printf("%s[%d]! MApi_XC_ReportPixelInfo: Report Window=(%u,%u,%u,%u), DE Window=(%u,%u,%u,%u)\n",
9612                 __FUNCTION__,__LINE__, pstRepPixInfo->u16XStart, pstRepPixInfo->u16XEnd, pstRepPixInfo->u16YStart, pstRepPixInfo->u16YEnd,
9613                 stDEWin.x, stDEWin.x + stDEWin.width - 1, stDEWin.y, stDEWin.y + stDEWin.height - 1);*/
9614 
9615     enRet = Hal_XC_ReportPixelInfo(pInstance, pstRepPixInfo);
9616     //restore for user
9617     pstRepPixInfo->u16XStart = stRepWin.x;
9618     pstRepPixInfo->u16XEnd = stRepWin.x + stRepWin.width - 1;
9619     pstRepPixInfo->u16YStart = stRepWin.y;
9620     pstRepPixInfo->u16YEnd = stRepWin.y + stRepWin.height -1;
9621 
9622     _XC_RETURN(pInstance);
9623     _XC_SEMAPHORE_RETURN(pInstance, E_XC_ID_VAR);
9624     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9625     return enRet;
9626 }
9627 
MApi_XC_ReportPixelInfo(MS_XC_REPORT_PIXELINFO * pstRepPixInfo)9628 MS_BOOL MApi_XC_ReportPixelInfo(MS_XC_REPORT_PIXELINFO *pstRepPixInfo)
9629 {
9630     if (pu32XCInst == NULL)
9631     {
9632         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9633         return FALSE;
9634     }
9635 
9636     stXC_GET_REPORT_PIXEL_INFO XCArgs;
9637     XCArgs.pstRepPixInfo = pstRepPixInfo;
9638     XCArgs.bReturnValue = FALSE;
9639 
9640     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_REPORT_PIXEL_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9641     {
9642         printf("Obtain XC engine fail\n");
9643         return E_APIXC_RET_FAIL;
9644     }
9645     else
9646     {
9647         return XCArgs.bReturnValue;
9648     }
9649 }
9650 
9651 ///This is an Obsolete functions, try use MApi_XC_Set_MemFmtEx
MApi_XC_Set_MemFmt_U2(void * pInstance,MS_XC_MEM_FMT eMemFmt)9652 MS_BOOL MApi_XC_Set_MemFmt_U2(void* pInstance, MS_XC_MEM_FMT eMemFmt)
9653 {
9654     MS_BOOL bret = FALSE;
9655     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9656     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9657     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9658     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9659     if(TRUE == MDrv_XC_Set_MemFmtEx(pInstance, eMemFmt, MAIN_WINDOW))
9660     {
9661         bret = MDrv_XC_Set_MemFmtEx(pInstance, eMemFmt, SUB_WINDOW);
9662     }
9663     else
9664     {
9665         bret = FALSE;
9666     }
9667     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9668     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9669     return bret;
9670 }
9671 
MApi_XC_Set_MemFmt(MS_XC_MEM_FMT eMemFmt)9672 MS_BOOL MApi_XC_Set_MemFmt(MS_XC_MEM_FMT eMemFmt)
9673 {
9674     if (pu32XCInst == NULL)
9675     {
9676         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9677         return FALSE;
9678     }
9679 
9680     stXC_SET_MEMORY_FORMAT XCArgs;
9681     XCArgs.eMemFmt = eMemFmt;
9682     XCArgs.bReturnValue = FALSE;
9683 
9684     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MEMORY_FORMAT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9685     {
9686         printf("Obtain XC engine fail\n");
9687         return FALSE;
9688     }
9689     else
9690     {
9691         return XCArgs.bReturnValue;
9692     }
9693 }
9694 
MDrv_XC_Set_MemFmtEx(void * pInstance,MS_XC_MEM_FMT eMemFmt,SCALER_WIN eWindow)9695 MS_BOOL MDrv_XC_Set_MemFmtEx(void *pInstance, MS_XC_MEM_FMT eMemFmt, SCALER_WIN eWindow)
9696 {
9697     MS_BOOL bret = FALSE;
9698     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9699     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9700     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9701     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9702     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9703     if(eMemFmt <= E_MS_XC_MEM_FMT_422)
9704     {
9705         pXCResourcePrivate->stdrvXC_MVideo.s_eMemFmt[eWindow] = eMemFmt;
9706         bret = TRUE;
9707     }
9708     else
9709     {
9710         bret = FALSE;
9711     }
9712     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9713     return bret;
9714 }
9715 
MApi_XC_Set_MemFmtEx_U2(void * pInstance,MS_XC_MEM_FMT eMemFmt,SCALER_WIN eWindow)9716 MS_BOOL MApi_XC_Set_MemFmtEx_U2(void* pInstance, MS_XC_MEM_FMT eMemFmt, SCALER_WIN eWindow)
9717 {
9718     MS_BOOL bReturn = FALSE;
9719     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9720     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9721     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9722     bReturn = MDrv_XC_Set_MemFmtEx(pInstance, eMemFmt, eWindow);
9723     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9724     return bReturn;
9725 }
9726 
MApi_XC_Set_MemFmtEx(MS_XC_MEM_FMT eMemFmt,SCALER_WIN eWindow)9727 MS_BOOL MApi_XC_Set_MemFmtEx(MS_XC_MEM_FMT eMemFmt, SCALER_WIN eWindow)
9728 {
9729     if (pu32XCInst == NULL)
9730     {
9731         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
9732         {
9733             printf("UtopiaOpen XC failed\n");
9734             return FALSE;
9735         }
9736     }
9737 
9738     stXC_SET_MEMORY_FORMAT_EX XCArgs;
9739     XCArgs.eMemFmt = eMemFmt;
9740     XCArgs.eWindow = eWindow;
9741     XCArgs.bReturnValue = FALSE;
9742 
9743     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MEMORY_FORMAT_EX, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9744     {
9745         printf("Obtain XC engine fail\n");
9746         return FALSE;
9747     }
9748     else
9749     {
9750         return XCArgs.bReturnValue;
9751     }
9752 }
9753 
9754 
MApi_XC_IsRequestFrameBufferLessMode_U2(void * pInstance)9755 MS_BOOL MApi_XC_IsRequestFrameBufferLessMode_U2(void* pInstance)
9756 {
9757     MS_BOOL bret = FALSE;
9758     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9759     bret = MDrv_XC_IsRequestFrameBufferLessMode(pInstance);
9760     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9761     return bret;
9762 }
9763 
MApi_XC_IsRequestFrameBufferLessMode(void)9764 MS_BOOL MApi_XC_IsRequestFrameBufferLessMode(void)
9765 {
9766     if (pu32XCInst == NULL)
9767     {
9768         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9769         return FALSE;
9770     }
9771 
9772     stXC_CHECK_REQUEST_FRAMEBUFFERLESS_MODE XCArgs;
9773     XCArgs.bReturnValue = FALSE;
9774 
9775     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_REQUEST_FRAMEBUFFERLESS_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9776     {
9777         printf("Obtain XC engine fail\n");
9778         return FALSE;
9779     }
9780     else
9781     {
9782         return XCArgs.bReturnValue;
9783     }
9784 }
9785 
9786 //-------------------------------------------------------------------------------------------------
9787 /// Set Flag to bypass software reset in MApi_XC_Init()
9788 /// @param  bFlag               \b IN: TRUE: initialize XC by skipping SW reset; FALSE: initialize XC in normal case
9789 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
9790 //-------------------------------------------------------------------------------------------------
MApi_XC_SkipSWReset_U2(void * pInstance,MS_BOOL bFlag)9791 E_APIXC_ReturnValue MApi_XC_SkipSWReset_U2(void* pInstance, MS_BOOL bFlag)
9792 {
9793     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9794     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9795     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9796     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9797 
9798     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
9799     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9800     pXCResourcePrivate->stdrvXC_MVideo._bSkipSWReset = bFlag;
9801     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9802     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
9803     return E_APIXC_RET_OK;
9804 }
9805 
MApi_XC_SkipSWReset(MS_BOOL bFlag)9806 E_APIXC_ReturnValue MApi_XC_SkipSWReset(MS_BOOL bFlag)
9807 {
9808     XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
9809     INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
9810 
9811     if (pu32XCInst == NULL)
9812     {
9813         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
9814         {
9815             printf("UtopiaOpen XC failed\n");
9816             return E_APIXC_RET_FAIL;
9817         }
9818     }
9819 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
9820      if (pu32XCInst_1 == NULL)
9821      {
9822         stXCInstantAttribute.u32DeviceID = 1;
9823         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
9824         {
9825             printf("UtopiaOpen XC failed\n");
9826             return E_APIXC_RET_FAIL;
9827         }
9828       }
9829 #endif
9830     stXC_SET_SKIP_SWRESET XCArgs;
9831     XCArgs.bFlag = bFlag;
9832     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
9833 
9834     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_SKIP_SWRESET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9835     {
9836         printf("Obtain XC engine fail\n");
9837         return E_APIXC_RET_FAIL;
9838     }
9839     else
9840     {
9841         return XCArgs.eReturnValue;
9842     }
9843 }
9844 
9845 //-------------------------------------------------------------------------------------------------
9846 /// Select which DE to vop
9847 /// @param  bFlag               \b IN: @ref E_OP2VOP_DE_SEL
9848 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
9849 //-------------------------------------------------------------------------------------------------
MApi_XC_OP2VOPDESel_U2(void * pInstance,E_OP2VOP_DE_SEL eVopDESel)9850 E_APIXC_ReturnValue MApi_XC_OP2VOPDESel_U2(void* pInstance, E_OP2VOP_DE_SEL eVopDESel)
9851 {
9852     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
9853     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9854     _XC_ENTRY(pInstance);
9855     eRet = Hal_SC_OP2VOPDESel(pInstance, eVopDESel);
9856     _XC_RETURN(pInstance);
9857     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9858     return eRet;
9859 }
9860 
MApi_XC_OP2VOPDESel(E_OP2VOP_DE_SEL eVopDESel)9861 E_APIXC_ReturnValue MApi_XC_OP2VOPDESel(E_OP2VOP_DE_SEL eVopDESel)
9862 {
9863     if (pu32XCInst == NULL)
9864     {
9865         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9866         return E_APIXC_RET_FAIL;
9867     }
9868 
9869     stXC_SET_OP2VOP_DE_SELECTION XCArgs;
9870     XCArgs.eVopDESel = eVopDESel;
9871     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
9872 
9873     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OP2VOP_DE_SELECTION, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9874     {
9875         printf("Obtain XC engine fail\n");
9876         return E_APIXC_RET_FAIL;
9877     }
9878     else
9879     {
9880         return XCArgs.eReturnValue;
9881     }
9882 }
9883 
9884 //-------------------------------------------------------------------------------------------------
9885 /// Set Video and OSD Layer at Scaler VOP
9886 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
9887 //-------------------------------------------------------------------------------------------------
MApi_XC_SetOSDLayer_U2(void * pInstance,E_VOP_OSD_LAYER_SEL eVOPOSDLayer,SCALER_WIN eWindow)9888 E_APIXC_ReturnValue MApi_XC_SetOSDLayer_U2(void* pInstance, E_VOP_OSD_LAYER_SEL  eVOPOSDLayer, SCALER_WIN eWindow)
9889 {
9890     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
9891     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9892 
9893     eRet = MDrv_XC_SetOSDLayer(pInstance, eVOPOSDLayer, eWindow);
9894     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9895     return eRet;
9896 }
9897 
MApi_XC_SetOSDLayer(E_VOP_OSD_LAYER_SEL eVOPOSDLayer,SCALER_WIN eWindow)9898 E_APIXC_ReturnValue MApi_XC_SetOSDLayer(E_VOP_OSD_LAYER_SEL  eVOPOSDLayer, SCALER_WIN eWindow)
9899 {
9900     if (pu32XCInst == NULL)
9901     {
9902         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9903         return E_APIXC_RET_FAIL;
9904     }
9905 
9906     stXC_SET_OSDLAYER XCArgs;
9907     XCArgs.eVOPOSDLayer = eVOPOSDLayer;
9908     XCArgs.eWindow = eWindow;
9909     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
9910 
9911     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OSDLAYER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9912     {
9913         printf("Obtain XC engine fail\n");
9914         return E_APIXC_RET_FAIL;
9915     }
9916     else
9917     {
9918         return XCArgs.eReturnValue;
9919     }
9920 }
9921 
9922 //-------------------------------------------------------------------------------------------------
9923 /// Get Video and OSD Layer Enum at Scaler VOP
9924 /// @return Enum value
9925 //-------------------------------------------------------------------------------------------------
MApi_XC_GetOSDLayer_U2(void * pInstance,SCALER_WIN eWindow)9926 E_VOP_OSD_LAYER_SEL MApi_XC_GetOSDLayer_U2(void* pInstance, SCALER_WIN eWindow)
9927 {
9928     E_VOP_OSD_LAYER_SEL eSelect = E_VOP_LAYER_RESERVED;
9929 
9930     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9931     eSelect = MDrv_XC_GetOSDLayer(pInstance, eWindow);
9932     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9933     return eSelect;
9934 }
9935 
MApi_XC_GetOSDLayer(SCALER_WIN eWindow)9936 E_VOP_OSD_LAYER_SEL MApi_XC_GetOSDLayer(SCALER_WIN eWindow)
9937 {
9938     if (pu32XCInst == NULL)
9939     {
9940         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9941         return E_VOP_LAYER_RESERVED;
9942     }
9943 
9944     stXC_GET_OSDLAYER XCArgs;
9945     XCArgs.eWindow = eWindow;
9946     XCArgs.eReturnValue = E_VOP_LAYER_RESERVED;
9947 
9948     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_OSDLAYER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9949     {
9950         printf("Obtain XC engine fail\n");
9951         return E_VOP_LAYER_RESERVED;
9952     }
9953     else
9954     {
9955         return XCArgs.eReturnValue;
9956     }
9957 }
9958 
9959 //-------------------------------------------------------------------------------------------------
9960 /// Set Constant Alpha Value of Video
9961 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
9962 //-------------------------------------------------------------------------------------------------
MApi_XC_SetVideoAlpha_U2(void * pInstance,MS_U8 u8Val,SCALER_WIN eWindow)9963 E_APIXC_ReturnValue MApi_XC_SetVideoAlpha_U2(void* pInstance, MS_U8 u8Val, SCALER_WIN eWindow)
9964 {
9965     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
9966     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
9967     eRet = MDrv_XC_SetVideoAlpha(pInstance, u8Val, eWindow);
9968     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
9969     return eRet;
9970 }
9971 
MApi_XC_SetVideoAlpha(MS_U8 u8Val,SCALER_WIN eWindow)9972 E_APIXC_ReturnValue MApi_XC_SetVideoAlpha(MS_U8 u8Val, SCALER_WIN eWindow)
9973 {
9974     if (pu32XCInst == NULL)
9975     {
9976         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
9977         return E_APIXC_RET_FAIL;
9978     }
9979 
9980     stXC_SET_VIDEO_ALPHA XCArgs;
9981     XCArgs.u8Val = u8Val;
9982     XCArgs.eWindow = eWindow;
9983     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
9984 
9985     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VIDEO_ALPHA, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
9986     {
9987         printf("Obtain XC engine fail\n");
9988         return E_APIXC_RET_FAIL;
9989     }
9990     else
9991     {
9992         return XCArgs.eReturnValue;
9993     }
9994 }
9995 //-------------------------------------------------------------------------------------------------
9996 /// Get Constant Alpha Value of Video
9997 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
9998 //-------------------------------------------------------------------------------------------------
MApi_XC_GetVideoAlpha_U2(void * pInstance,MS_U8 * pu8Val,SCALER_WIN eWindow)9999 E_APIXC_ReturnValue MApi_XC_GetVideoAlpha_U2(void* pInstance, MS_U8 *pu8Val, SCALER_WIN eWindow)
10000 {
10001     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
10002     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10003     eRet = MDrv_XC_GetVideoAlpha(pInstance, pu8Val, eWindow);
10004     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10005     return eRet;
10006 
10007 }
10008 
MApi_XC_GetVideoAlpha(MS_U8 * pu8Val,SCALER_WIN eWindow)10009 E_APIXC_ReturnValue MApi_XC_GetVideoAlpha(MS_U8 *pu8Val, SCALER_WIN eWindow)
10010 {
10011     if (pu32XCInst == NULL)
10012     {
10013         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10014         return E_APIXC_RET_FAIL;
10015     }
10016 
10017     stXC_GET_VIDEO_ALPHA XCArgs;
10018     XCArgs.pu8Val = pu8Val;
10019     XCArgs.eWindow = eWindow;
10020     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10021 
10022     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_VIDEO_ALPHA, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10023     {
10024         printf("Obtain XC engine fail\n");
10025         return E_APIXC_RET_FAIL;
10026     }
10027     else
10028     {
10029         return XCArgs.eReturnValue;
10030     }
10031 }
10032 
10033 //-------------------------------------------------------------------------------------------------
10034 /// Get field packing mode support status
10035 /// @return TRUE(success) or FALSE(fail)
10036 //-------------------------------------------------------------------------------------------------
MApi_XC_IsFieldPackingModeSupported_U2(void * pInstance)10037 MS_BOOL MApi_XC_IsFieldPackingModeSupported_U2(void* pInstance)
10038 {
10039     MS_BOOL bRet = FALSE;
10040     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10041     bRet = MDrv_XC_Get_SCMI_Type();
10042     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10043     return bRet;
10044 }
10045 
MApi_XC_IsFieldPackingModeSupported(void)10046 MS_BOOL MApi_XC_IsFieldPackingModeSupported(void)
10047 {
10048     if (pu32XCInst == NULL)
10049     {
10050         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10051         return FALSE;
10052     }
10053 
10054     stXC_CHECK_FIELDPACKINGMODE_SUPPORTED XCArgs;
10055     XCArgs.bReturnValue = FALSE;
10056 
10057     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_FIELDPACKINGMODE_SUPPORTED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10058     {
10059         printf("Obtain XC engine fail\n");
10060         return FALSE;
10061     }
10062     else
10063     {
10064         return XCArgs.bReturnValue;
10065     }
10066 }
10067 
10068 //-------------------------------------------------------------------------------------------------
10069 // Skip Wait Vsync
10070 /// @param eWindow               \b IN: Enable
10071 /// @param Skip wait Vsync      \b IN: Disable wait Vsync
10072 //-------------------------------------------------------------------------------------------------
MApi_XC_SkipWaitVsync_U2(void * pInstance,MS_BOOL eWindow,MS_BOOL bIsSkipWaitVsyn)10073 E_APIXC_ReturnValue MApi_XC_SkipWaitVsync_U2( void* pInstance, MS_BOOL eWindow,MS_BOOL bIsSkipWaitVsyn)
10074 {
10075     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10076     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10077     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10078     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10079     MDrv_SC_SetSkipWaitVsync(pInstance, eWindow, bIsSkipWaitVsyn);
10080     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10081     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10082     return E_APIXC_RET_OK;
10083 }
10084 
MApi_XC_SkipWaitVsync(MS_BOOL eWindow,MS_BOOL bIsSkipWaitVsyn)10085 E_APIXC_ReturnValue MApi_XC_SkipWaitVsync( MS_BOOL eWindow,MS_BOOL bIsSkipWaitVsyn)
10086 {
10087     if (pu32XCInst == NULL)
10088     {
10089         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10090         return E_APIXC_RET_FAIL;
10091     }
10092 
10093     stXC_SKIP_WAIT_VSYNC XCArgs;
10094     XCArgs.eWindow = eWindow;
10095     XCArgs.bIsSkipWaitVsyn = bIsSkipWaitVsyn;
10096     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10097 
10098     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SKIP_WAIT_VSYNC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10099     {
10100         printf("Obtain XC engine fail\n");
10101         return E_APIXC_RET_FAIL;
10102     }
10103     else
10104     {
10105         return XCArgs.eReturnValue;
10106     }
10107 }
10108 
10109 //-------------------------------------------------------------------------------------------------
10110 /// Set XC CMA Heap ID
10111 /// @param  u8CMAHeapID            \b IN: CMA Heap ID
10112 /// @param  eWindow                 \b IN: which window we are going to set
10113 //-------------------------------------------------------------------------------------------------
MApi_XC_SetCMAHeapID_U2(void * pInstance,MS_U8 u8CMAHeapID,SCALER_WIN eWindow)10114 E_APIXC_ReturnValue MApi_XC_SetCMAHeapID_U2( void* pInstance, MS_U8 u8CMAHeapID, SCALER_WIN eWindow)
10115 {
10116     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10117     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10118     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10119     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10120     MDrv_SC_SetCMAHeapID(pInstance, u8CMAHeapID, eWindow);
10121     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10122     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10123     return E_APIXC_RET_OK;
10124 }
10125 
MApi_XC_SetCMAHeapID(MS_U8 u8CMAHeapID,SCALER_WIN eWindow)10126 E_APIXC_ReturnValue MApi_XC_SetCMAHeapID(MS_U8 u8CMAHeapID, SCALER_WIN eWindow)
10127 {
10128     if (pu32XCInst == NULL)
10129     {
10130         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10131         return E_APIXC_RET_FAIL;
10132     }
10133 
10134     stXC_SET_CMA_HEAP_ID XCArgs;
10135     XCArgs.u8CMAHeapID = u8CMAHeapID;
10136     XCArgs.eWindow = eWindow;
10137     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10138 
10139     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_CMA_HEAP_ID, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10140     {
10141         printf("Obtain XC engine fail\n");
10142         return E_APIXC_RET_FAIL;
10143     }
10144     else
10145     {
10146         return XCArgs.eReturnValue;
10147     }
10148 }
10149 
10150 //-------------------------------------------------------------------------------------------------
10151 /// Set the VGA SOG on or off
10152 /// @param  bEnable                \b IN: bEnable =1, Turn on the VGA SOG; bEnable =0, Turn off the VGA SOG
10153 //-------------------------------------------------------------------------------------------------
MApi_XC_SetVGASogEn_U2(void * pInstance,MS_BOOL bVGASogEn)10154 E_APIXC_ReturnValue MApi_XC_SetVGASogEn_U2(void* pInstance, MS_BOOL bVGASogEn)
10155 {
10156     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10157     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10158     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10159     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10160     MDrv_XC_SetVGASogEn(pInstance, bVGASogEn);
10161     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10162     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10163     return E_APIXC_RET_OK;
10164 }
10165 
MApi_XC_SetVGASogEn(MS_BOOL bVGASogEn)10166 E_APIXC_ReturnValue MApi_XC_SetVGASogEn(MS_BOOL bVGASogEn)
10167 {
10168     if (pu32XCInst == NULL)
10169     {
10170         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10171         return E_APIXC_RET_FAIL;
10172     }
10173 
10174     stXC_SET_VGA_SOG_ENABLE XCArgs;
10175     XCArgs.bVGASogEn = bVGASogEn;
10176     XCArgs.eReturnValue = FALSE;
10177 
10178     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VGA_SOG_ENABLE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10179     {
10180         printf("Obtain XC engine fail\n");
10181         return E_APIXC_RET_FAIL;
10182     }
10183     else
10184     {
10185         return XCArgs.eReturnValue;
10186     }
10187 }
10188 
10189 //-------------------------------------------------------------------------------------------------
10190 /// Set pixel shift
10191 /// @param  s8H               \b IN: pixel shift H
10192 /// @param  s8V               \b IN: pixel shift V
10193 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10194 //-------------------------------------------------------------------------------------------------
MApi_XC_SetPixelShift_U2(void * pInstance,MS_S8 s8H,MS_S8 s8V)10195 E_APIXC_ReturnValue MApi_XC_SetPixelShift_U2(void* pInstance, MS_S8 s8H, MS_S8 s8V)
10196 {
10197     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
10198     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10199     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10200     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10201     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10202     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10203     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10204     _XC_ENTRY(pInstance);
10205 
10206     MS_BOOL bEnablePS=TRUE;
10207     MS_S8 s8CheckHData=0;
10208     MS_S8 s8CheckVData=0;
10209 
10210     s8CheckHData = (MS_S8) pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange / 2;
10211     s8CheckVData = (MS_S8) pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange / 2;
10212 
10213     if(pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange==0 && pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange==0)
10214     {
10215         //close pixel shift ( if H range == 0 && V range ==0 )
10216         bEnablePS = FALSE;
10217 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
10218         MHal_XC_PixelShiftStatusChange(pInstance, EN_XC_PIXEL_SHIFT_DISABLE);
10219 #endif
10220     }
10221     //else if( (s8H > s8CheckHData || s8H < ((-1)*s8CheckHData) )  ||  (s8V > s8CheckVData || s8V < ((-1)*s8CheckVData) )  )
10222     //{
10223     //    bEnablePS = FALSE;
10224     //}
10225     else
10226     {
10227         bEnablePS = TRUE;
10228 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
10229         MHal_XC_PixelShiftStatusChange(pInstance, EN_XC_PIXEL_SHIFT_ENABLE);
10230 #endif
10231     }
10232     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[pixel shift] shift H=%d (%d ~ %d)\n",s8H,((-1)*s8CheckHData),s8CheckHData);
10233     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[pixel shift] shift V=%d (%d ~ %d)\n",s8V,((-1)*s8CheckVData),s8CheckVData);
10234 
10235     if(bEnablePS)
10236     {
10237         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[pixel shift] do pixel shift...\n");
10238         eRet = MDrv_XC_SetPixelShift(pInstance, s8H, s8V);
10239     }
10240     else
10241     {
10242         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[pixel shift] not support!!!\n");
10243     }
10244     _XC_RETURN(pInstance);
10245     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10246     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10247     return eRet;
10248 }
10249 
MApi_XC_SetPixelShift(MS_S8 s8H,MS_S8 s8V)10250 E_APIXC_ReturnValue MApi_XC_SetPixelShift(MS_S8 s8H, MS_S8 s8V)
10251 {
10252     if (pu32XCInst == NULL)
10253     {
10254         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10255         return E_APIXC_RET_FAIL;
10256     }
10257 
10258     stXC_SET_PIXEL_SHIFT XCArgs;
10259     XCArgs.s8H = s8H;
10260     XCArgs.s8V = s8V;
10261     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10262 
10263     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_PIXEL_SHIFT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10264     {
10265         printf("Obtain XC engine fail\n");
10266         return E_APIXC_RET_FAIL;
10267     }
10268     else
10269     {
10270         return XCArgs.eReturnValue;
10271     }
10272 }
10273 
MApi_XC_SetPixelShiftFeatures_U2(void * pInstance,MS_U16 u16HPixelShiftRange,MS_U16 u16VPixelShiftRange,PIXEL_SHIFT_FEATURE ePixelShiftFeature)10274 E_APIXC_ReturnValue MApi_XC_SetPixelShiftFeatures_U2(void* pInstance,
10275                                                      MS_U16 u16HPixelShiftRange,
10276                                                      MS_U16 u16VPixelShiftRange,
10277                                                      PIXEL_SHIFT_FEATURE ePixelShiftFeature)
10278 {
10279     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10280     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10281     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10282     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10283     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10284 
10285     pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange = 2 * u16HPixelShiftRange;
10286     pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange = 2 * u16VPixelShiftRange;
10287     pXCResourcePrivate->stdrvXC_MVideo.gePixelShiftFeature = ePixelShiftFeature;
10288 
10289     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10290     return E_APIXC_RET_OK;
10291 }
10292 
MApi_XC_SetPixelShiftFeatures(MS_U16 u16HPixelShiftRange,MS_U16 u16VPixelShiftRange,PIXEL_SHIFT_FEATURE ePixelShiftFeature)10293 E_APIXC_ReturnValue MApi_XC_SetPixelShiftFeatures(MS_U16 u16HPixelShiftRange,
10294                                                   MS_U16 u16VPixelShiftRange,
10295                                                   PIXEL_SHIFT_FEATURE ePixelShiftFeature)
10296 {
10297     if (pu32XCInst == NULL)
10298     {
10299         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10300         return E_APIXC_RET_FAIL;
10301     }
10302 
10303     stXC_SET_PIXELSHIFT_FEATURES XCArgs;
10304     XCArgs.u16HPixelShiftRange = u16HPixelShiftRange;
10305     XCArgs.u16VPixelShiftRange = u16VPixelShiftRange;
10306     XCArgs.ePixelShiftFeature = ePixelShiftFeature;
10307     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10308 
10309     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_PIXEL_SHIFT_FEATURES, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10310     {
10311         printf("Obtain XC engine fail\n");
10312         return E_APIXC_RET_FAIL;
10313     }
10314     else
10315     {
10316         return XCArgs.eReturnValue;
10317     }
10318 }
10319 
10320 //-------------------------------------------------------------------------------------------------
10321 /// Set the specific window for traveling mode(VE capture function)
10322 /// @param  pstXC_SetWin_Info      \b IN: the information of the window setting
10323 /// @param  u32InitDataLen         \b IN: the length of the pstXC_SetWin_Info
10324 /// @param  eWindow                \b IN: which window we are going to set
10325 /// @return @ref MS_BOOL
10326 //-------------------------------------------------------------------------------------------------
MApi_XC_SetTravelingWindow_U2(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,MS_U32 u32InitDataLen,SCALER_WIN eWindow)10327 MS_BOOL MApi_XC_SetTravelingWindow_U2(void* pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, MS_U32 u32InitDataLen, SCALER_WIN eWindow)
10328 {
10329     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10330     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10331     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10332     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10333     //The component 1080i can't frame lock when capture start is odd.
10334     if(pstXC_SetWin_Info->bInterlace)
10335     {
10336         // the Capture start should be even
10337         if(pstXC_SetWin_Info->stCapWin.y%2)
10338         {
10339             pstXC_SetWin_Info->stCapWin.y += 1;
10340         }
10341         pstXC_SetWin_Info->stCapWin.height = pstXC_SetWin_Info->stCapWin.height & (~0x01);
10342     }
10343     pstXC_SetWin_Info->stCapWin.width = pstXC_SetWin_Info->stCapWin.width & (~0x01);
10344 
10345     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10346     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10347     // copy user data to internal data
10348     // here is a patch first, will remove after seperate Internal XC status with set window information
10349     //u32CopyLen = sizeof(XC_SETWIN_INFO) - (sizeof(MS_BOOL)*2) - (sizeof(MS_U16)*4);
10350     //memcpy(&gSrcInfo[eWindow], pstXC_SetWin_Info, u32CopyLen);
10351     //do not use memcpy(), strongly depend on structure definition
10352     _Mdrv_XC_CopySetWinInfo(pInstance, pstXC_SetWin_Info, eWindow);
10353 
10354     gSrcInfo[eWindow].stDispWin.x += gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16HStart;
10355     gSrcInfo[eWindow].stDispWin.y += gSrcInfo[eWindow].Status2.stXCPanelDefaultTiming.u16VStart;
10356 
10357     // dump debug msg
10358     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= SetTravelingWindow Start (Window : %u, src: %u) =============\n",eWindow, gSrcInfo[eWindow].enInputSourceType);
10359     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CapWin  x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCapWin.x, gSrcInfo[eWindow].stCapWin.y, gSrcInfo[eWindow].stCapWin.width, gSrcInfo[eWindow].stCapWin.height);
10360     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CropWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCropWin.x, gSrcInfo[eWindow].stCropWin.y, gSrcInfo[eWindow].stCropWin.width, gSrcInfo[eWindow].stCropWin.height);
10361     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stDispWin.x,gSrcInfo[eWindow].stDispWin.y, gSrcInfo[eWindow].stDispWin.width, gSrcInfo[eWindow].stDispWin.height);
10362     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Panel   x: %4u  y: %4u  w: %4u  h: %4u \n",
10363                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart,
10364                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart,
10365                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width,
10366                                        pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
10367     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Mirror/Interlace/Hdup = %u/%u/%u\n", IsVMirrorMode(eWindow), pstXC_SetWin_Info->bInterlace, pstXC_SetWin_Info->bHDuplicate);
10368     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"H/V total = (%u, %u), VFreq = %u\n", pstXC_SetWin_Info->u16DefaultHtotal, pstXC_SetWin_Info->u16InputVTotal, pstXC_SetWin_Info->u16InputVFreq);
10369 
10370     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10371     // Scaler must update source before width / height checking.
10372     _MDrv_XC_Set_PQ_SourceData(pInstance, eWindow, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow]);
10373     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10374 
10375     // Capture width & height can not be 0 !!
10376     if ((gSrcInfo[eWindow].stCapWin.width < 0x20) || (gSrcInfo[eWindow].stCapWin.height < 0x20) ||
10377         (gSrcInfo[eWindow].stCapWin.x > 0x7FF)    || (gSrcInfo[eWindow].stCapWin.y > 0x7FF))
10378     {
10379         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Cap Width/Height can not be smaller than 0x20, or X/Y can not bigger than 0x7FF \n");
10380         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10381         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10382         return FALSE;
10383     }
10384 /* //Useless code
10385 #if ENABLE_REQUEST_FBL
10386     if(s_PQ_Function_Info.pq_ioctl)
10387     {
10388         s_PQ_Function_Info.pq_ioctl((PQ_WIN)eWindow, E_PQ_IOCTL_RFBL_CTRL, NULL, NULL);
10389     }
10390 #endif
10391 */
10392     _XC_ENTRY(pInstance);
10393     MDrv_sc_set_capture_window(pInstance, eWindow );//Fine tune capture window
10394     Hal_SC_ip_set_capture_h_start(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapStart, eWindow); //Set the tuned capture window
10395     Hal_SC_ip_set_capture_v_start(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_CapStart, eWindow);
10396     Hal_SC_ip_set_capture_h_size (pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_CapSize , eWindow);
10397     Hal_SC_ip_set_capture_v_size (pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16V_CapSize , eWindow);
10398     _XC_RETURN(pInstance);
10399 
10400     if (IsSrcTypeVga(gSrcInfo[eWindow].enInputSourceType)   ||
10401         IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) ||
10402         IsSrcTypeScart(gSrcInfo[eWindow].enInputSourceType) )
10403     {
10404         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"ADC Set Mode \n");
10405         PQ_ADC_SAMPLING_INFO stPQADCSamplingInfo;
10406         memset(&stPQADCSamplingInfo,0,sizeof(PQ_ADC_SAMPLING_INFO));
10407         if ( IsSrcTypeVga(gSrcInfo[eWindow].enInputSourceType) || IsSrcTypeYPbPr(gSrcInfo[eWindow].enInputSourceType) )
10408         {
10409             if(gSrcInfo[eWindow].bHDuplicate)
10410             {
10411                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10412                 MDrv_XC_ADC_GetPQADCSamplingInfo(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], &stPQADCSamplingInfo, eWindow);
10413                 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10414             }
10415         }
10416 
10417         MDrv_XC_ADC_SetMode(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], &stPQADCSamplingInfo, eWindow);
10418     }
10419     else
10420     {
10421         MDrv_XC_ADC_SCART_RGB_setMode(pInstance,FALSE);
10422     }
10423     memcpy(&gSrcInfo[eWindow].stStatusnodelay.stDispWin, &gSrcInfo[eWindow].stDispWin, sizeof(MS_WINDOW_TYPE));
10424     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10425     msAPI_Scaler_SetMode(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], eWindow);
10426 /*
10427     if((s_PQ_Function_Info.pq_set_csc == NULL) || (s_PQ_Function_Info.pq_set_memformat == NULL))
10428     {
10429         Hal_SC_set_csc(TRUE, eWindow);
10430         Hal_SC_set_444To422(ENABLE, eWindow);
10431         gSrcInfo[eWindow].bUseYUVSpace = TRUE;
10432         gSrcInfo[eWindow].bMemYUVFmt = TRUE;
10433     }
10434 */
10435     MDrv_SC_set_2p_mode(pInstance, pstXC_SetWin_Info, eWindow);
10436     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= SetTravelingWindow Done (Window : %u, src: %u) =============\n",eWindow, gSrcInfo[eWindow].enInputSourceType);
10437     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10438 
10439     return TRUE;
10440 }
10441 
MApi_XC_SetTravelingWindow(XC_SETWIN_INFO * pstXC_SetWin_Info,MS_U32 u32InitDataLen,SCALER_WIN eWindow)10442 MS_BOOL MApi_XC_SetTravelingWindow(XC_SETWIN_INFO *pstXC_SetWin_Info, MS_U32 u32InitDataLen, SCALER_WIN eWindow)
10443 {
10444     if (pu32XCInst == NULL)
10445     {
10446         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10447         return FALSE;
10448     }
10449 
10450 #if (defined (ANDROID))
10451     static XC_INITMISC tmp_Init_Misc;
10452     stXC_GET_MISC_STATUS XCArgs1;
10453     XCArgs1.pXC_Init_Misc = &tmp_Init_Misc;
10454     XCArgs1.eReturnValue = E_APIXC_RET_FAIL;
10455 
10456     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MISC_STATUS, (void*)&XCArgs1) != UTOPIA_STATUS_SUCCESS)
10457     {
10458         printf("Obtain XC engine fail\n");
10459         return E_APIXC_RET_FAIL;
10460     }
10461 
10462     if(!(tmp_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_IS_ANDROID))
10463     {
10464         tmp_Init_Misc.u32MISC_A |= E_XC_INIT_MISC_A_IS_ANDROID;
10465 
10466         stXC_INIT_MISC XCArgs2;
10467         XCArgs2.pXC_Init_Misc = &tmp_Init_Misc;
10468         XCArgs2.u32InitMiscDataLen = sizeof(XC_INITMISC);
10469         XCArgs2.eReturnValue = E_APIXC_RET_FAIL;
10470 
10471         if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
10472         {
10473             printf("Obtain XC engine fail\n");
10474             return E_APIXC_RET_FAIL;
10475         }
10476     }
10477 #else
10478     static XC_INITMISC tmp_Init_Misc;
10479     stXC_GET_MISC_STATUS XCArgs1;
10480     XCArgs1.pXC_Init_Misc = &tmp_Init_Misc;
10481     XCArgs1.eReturnValue = E_APIXC_RET_FAIL;
10482 
10483     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MISC_STATUS, (void*)&XCArgs1) != UTOPIA_STATUS_SUCCESS)
10484     {
10485         printf("Obtain XC engine fail\n");
10486         return E_APIXC_RET_FAIL;
10487     }
10488 
10489     if(tmp_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_IS_ANDROID)
10490     {
10491         tmp_Init_Misc.u32MISC_A = tmp_Init_Misc.u32MISC_A & (~E_XC_INIT_MISC_A_IS_ANDROID);
10492         stXC_INIT_MISC XCArgs2;
10493         XCArgs2.pXC_Init_Misc = &tmp_Init_Misc;
10494         XCArgs2.u32InitMiscDataLen = sizeof(XC_INITMISC);
10495         XCArgs2.eReturnValue = E_APIXC_RET_FAIL;
10496 
10497         if(UtopiaIoctl(pu32XCInst, E_XC_CMD_INIT_MISC, (void*)&XCArgs2) != UTOPIA_STATUS_SUCCESS)
10498         {
10499             printf("Obtain XC engine fail\n");
10500             return E_APIXC_RET_FAIL;
10501         }
10502     }
10503 #endif
10504 
10505     stXC_SET_TRAVELING_WINDOW XCArgs;
10506     XCArgs.pstXC_SetWin_Info = pstXC_SetWin_Info;
10507     XCArgs.u32InitDataLen = u32InitDataLen;
10508     XCArgs.eWindow = eWindow;
10509     XCArgs.bReturnValue = FALSE;
10510 
10511     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_TRAVELING_WINDOW, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10512     {
10513         printf("Obtain XC engine fail\n");
10514         return FALSE;
10515     }
10516     else
10517     {
10518         return XCArgs.bReturnValue;
10519     }
10520 }
10521 
10522 //-------------------------------------------------------------------------------------------------
10523 /// MApi_XC_Combine_MLoadEn
10524 /// @param  bEnable               \b IN: whether to menuload
10525 /// Do an example when you want to menuload OSDLayer :
10526 /// MApi_XC_Combine_MLoadEn(TRUE)
10527 /// call xc function
10528 /// MApi_XC_Combine_MLoadEn(FALSE)
10529 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10530 //-------------------------------------------------------------------------------------------------
MApi_XC_Combine_MLoadEn_U2(void * pInstance,MS_BOOL bEn)10531 E_APIXC_ReturnValue MApi_XC_Combine_MLoadEn_U2(void* pInstance, MS_BOOL bEn)
10532 {
10533     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10534     MDrv_XC_Combine_MLoadEn(pInstance, bEn);
10535     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10536     return E_APIXC_RET_OK;
10537 }
10538 
MApi_XC_Combine_MLoadEn(MS_BOOL bEn)10539 E_APIXC_ReturnValue MApi_XC_Combine_MLoadEn(MS_BOOL bEn)
10540 {
10541     if (pu32XCInst == NULL)
10542     {
10543         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10544         return E_APIXC_RET_FAIL;
10545     }
10546 
10547     stXC_MLOAD_COMBINE stXCArgs;
10548     stXCArgs.bEn = bEn;
10549     stXCArgs.eReturnValue = E_APIXC_RET_FAIL;
10550 
10551     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_MLOAD_COMBINE, (void*)&stXCArgs) != UTOPIA_STATUS_SUCCESS)
10552     {
10553         printf("Obtain XC engine fail\n");
10554         return E_APIXC_RET_FAIL;
10555     }
10556     else
10557     {
10558         return stXCArgs.eReturnValue;
10559     }
10560 }
10561 
10562 //-------------------------------------------------------------------------------------------------
10563 /// MApi_XC_SetVideoOnOSD
10564 /// @param  E_VDO_ON_OSD_LAYER               \b IN: set video show on which osd layer
10565 /// @param  eWindow                                     \b IN: set main or sub video data to memory
10566 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10567 //-------------------------------------------------------------------------------------------------
MApi_XC_SetVideoOnOSD_U2(void * pInstance,E_VIDEO_ON_OSD_LAYER enlayer,SCALER_WIN eWindow)10568 E_APIXC_ReturnValue MApi_XC_SetVideoOnOSD_U2(void* pInstance, E_VIDEO_ON_OSD_LAYER enlayer, SCALER_WIN eWindow)
10569 {
10570     E_APIXC_ReturnValue bRet = E_APIXC_RET_FAIL;
10571     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10572     _XC_ENTRY(pInstance);
10573     bRet = MDrv_SC_SetVideoOnOSD(pInstance, enlayer, eWindow);
10574     _XC_RETURN(pInstance);
10575     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10576     return bRet;
10577 
10578 }
10579 
MApi_XC_SetVideoOnOSD(E_VIDEO_ON_OSD_LAYER enlayer,SCALER_WIN eWindow)10580 E_APIXC_ReturnValue MApi_XC_SetVideoOnOSD(E_VIDEO_ON_OSD_LAYER enlayer, SCALER_WIN eWindow)
10581 {
10582     if (pu32XCInst == NULL)
10583     {
10584         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10585         return E_APIXC_RET_FAIL;
10586     }
10587 
10588     stXC_SET_VIDEO_ON_OSD XCArgs;
10589     XCArgs.enlayer = enlayer;
10590     XCArgs.eWindow = eWindow;
10591     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10592 
10593     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VIDEO_ON_OSD, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10594     {
10595         printf("Obtain XC engine fail\n");
10596         return E_APIXC_RET_FAIL;
10597     }
10598     else
10599     {
10600         return XCArgs.eReturnValue;
10601     }
10602 }
10603 
10604 //-------------------------------------------------------------------------------------------------
10605 /// MApi_XC_SetOSDLayerBlending
10606 /// @param  u8Layer               \b IN: which osd layer will blend
10607 /// @param  bEnable               \b IN: whether to blend
10608 /// @param  eWindow               \b IN: which window blend with
10609 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10610 //-------------------------------------------------------------------------------------------------
MApi_XC_SetOSDLayerBlending_U2(void * pInstance,MS_U8 u8Layer,MS_BOOL bEnable,SCALER_WIN eWindow)10611 E_APIXC_ReturnValue MApi_XC_SetOSDLayerBlending_U2(void* pInstance, MS_U8 u8Layer, MS_BOOL bEnable, SCALER_WIN eWindow)
10612 {
10613     E_APIXC_ReturnValue bRet = E_APIXC_RET_FAIL;
10614     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10615     _XC_ENTRY(pInstance);
10616     bRet = MDrv_SC_SetOSDLayerBlending(pInstance, u8Layer, bEnable, eWindow);
10617     _XC_RETURN(pInstance);
10618     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10619     return bRet;
10620 }
10621 
MApi_XC_SetOSDLayerBlending(MS_U8 u8Layer,MS_BOOL bEnable,SCALER_WIN eWindow)10622 E_APIXC_ReturnValue MApi_XC_SetOSDLayerBlending(MS_U8 u8Layer, MS_BOOL bEnable, SCALER_WIN eWindow)
10623 {
10624     if (pu32XCInst == NULL)
10625     {
10626         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10627         return E_APIXC_RET_FAIL;
10628     }
10629 
10630     stXC_SET_OSD_LAYER_BLENDING stXCArgs;
10631     stXCArgs.u8Layer = u8Layer;
10632     stXCArgs.bEnable = bEnable;
10633     stXCArgs.eWindow = eWindow;
10634     stXCArgs.eReturnValue = E_APIXC_RET_FAIL;
10635 
10636     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OSD_LAYER_BLEANDING, (void*)&stXCArgs) != UTOPIA_STATUS_SUCCESS)
10637     {
10638         printf("Obtain XC engine fail\n");
10639         return E_APIXC_RET_FAIL;
10640     }
10641     else
10642     {
10643         return stXCArgs.eReturnValue;
10644     }
10645 }
10646 
10647 //-------------------------------------------------------------------------------------------------
10648 /// MApi_XC_SetOSDLayerAlpha
10649 /// @param  u8Layer                 \b IN: which osd layer will blend
10650 /// @param  u16Alpha                \b IN: blending alpha
10651 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10652 //-------------------------------------------------------------------------------------------------
MApi_XC_SetOSDLayerAlpha_U2(void * pInstance,MS_U8 u8Layer,MS_U8 u8Alpha)10653 E_APIXC_ReturnValue MApi_XC_SetOSDLayerAlpha_U2(void* pInstance, MS_U8 u8Layer, MS_U8 u8Alpha)
10654 {
10655     E_APIXC_ReturnValue bRet = E_APIXC_RET_FAIL;
10656     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10657     _XC_ENTRY(pInstance);
10658     bRet = MDrv_SC_SetOSDLayerAlpha(pInstance, u8Layer, u8Alpha);
10659     _XC_RETURN(pInstance);
10660     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10661     return bRet;
10662 }
10663 
MApi_XC_SetOSDLayerAlpha(MS_U8 u8Layer,MS_U8 u8Alpha)10664 E_APIXC_ReturnValue MApi_XC_SetOSDLayerAlpha(MS_U8 u8Layer, MS_U8 u8Alpha)
10665 {
10666     if (pu32XCInst == NULL)
10667     {
10668         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10669         return E_APIXC_RET_FAIL;
10670     }
10671 
10672     stXC_SET_OSD_LAYER_ALPHA stXCArgs;
10673     stXCArgs.u8Layer = u8Layer;
10674     stXCArgs.u8Alpha = u8Alpha;
10675     stXCArgs.eReturnValue = E_APIXC_RET_FAIL;
10676 
10677     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OSD_LAYER_ALPHA, (void*)&stXCArgs) != UTOPIA_STATUS_SUCCESS)
10678     {
10679         printf("Obtain XC engine fail\n");
10680         return E_APIXC_RET_FAIL;
10681     }
10682     else
10683     {
10684         return stXCArgs.eReturnValue;
10685     }
10686 }
10687 
10688 //-------------------------------------------------------------------------------------------------
10689 /// MApi_XC_SetOSDBlendingFormula
10690 /// @param  enOsdIndex                              \b IN: osd index
10691 /// @param  enType                                  \b IN: osd blending type
10692 /// @param  eWindow                                 \b IN: blending with main or sub video
10693 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
10694 //-------------------------------------------------------------------------------------------------
MApi_XC_SetOSDBlendingFormula_U2(void * pInstance,E_XC_OSD_INDEX enOsdIndex,E_XC_OSD_BlENDING_TYPE enType,SCALER_WIN eWindow)10695 E_APIXC_ReturnValue MApi_XC_SetOSDBlendingFormula_U2(void* pInstance, E_XC_OSD_INDEX enOsdIndex, E_XC_OSD_BlENDING_TYPE enType, SCALER_WIN eWindow)
10696 {
10697     E_APIXC_ReturnValue bRet = E_APIXC_RET_OK;
10698     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10699 
10700     _XC_ENTRY(pInstance);
10701     bRet = MDrv_SC_SetOSDBlendingFormula(pInstance, enOsdIndex, enType, eWindow);
10702     _XC_RETURN(pInstance);
10703     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10704     return bRet;
10705 }
10706 
MApi_XC_SetOSDBlendingFormula(E_XC_OSD_INDEX enOsdIndex,E_XC_OSD_BlENDING_TYPE enType,SCALER_WIN eWindow)10707 E_APIXC_ReturnValue MApi_XC_SetOSDBlendingFormula(E_XC_OSD_INDEX enOsdIndex, E_XC_OSD_BlENDING_TYPE enType, SCALER_WIN eWindow)
10708 {
10709     if (pu32XCInst == NULL)
10710     {
10711         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10712         return E_APIXC_RET_FAIL;
10713     }
10714 
10715     stXC_SET_OSD_BLENDING_FORMULA XCArgs;
10716     XCArgs.enOsdIndex = enOsdIndex;
10717     XCArgs.enType = enType;
10718     XCArgs.eWindow = eWindow;
10719     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
10720 
10721     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_OSD_BLENDING_FORMULA, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10722     {
10723         printf("Obtain XC engine fail\n");
10724         return E_APIXC_RET_FAIL;
10725     }
10726     else
10727     {
10728         return XCArgs.eReturnValue;
10729     }
10730 }
10731 
10732 //-------------------------------------------------------------------------------------------------
10733 /// MApi_XC_SetScaling
10734 /// @param  bEnable                               \b IN: set enable or disable
10735 /// @param  eScaling_type                      \b IN: set scaling type, pre-scaling, post-scaling, both-scaling
10736 /// @param  eVector_type                       \b IN: set H vector, v vector, and HV vector
10737 /// @param  eWindow                             \b IN: set main or sub video data to memory
10738 //-------------------------------------------------------------------------------------------------
MApi_XC_SetScaling_U2(void * pInstance,MS_BOOL bEnable,E_XC_SCALING_TYPE eScaling_type,E_XC_VECTOR_TYPE eVector_type,SCALER_WIN eWindow)10739 void MApi_XC_SetScaling_U2( void* pInstance, MS_BOOL bEnable, E_XC_SCALING_TYPE eScaling_type, E_XC_VECTOR_TYPE eVector_type, SCALER_WIN eWindow )
10740 {
10741     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10742     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10743     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10744 
10745     if(eScaling_type == E_XC_PRE_SCALING)
10746     {
10747         if(eWindow == MAIN_WINDOW)
10748         {
10749             switch(eVector_type)
10750             {
10751                 case E_XC_H_VECTOR:
10752                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_05_L, bEnable<<15 , BIT(15) );
10753                     break;
10754                 case E_XC_V_VECTOR:
10755                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, bEnable<<15 , BIT(15) );
10756                     break;
10757                 default:
10758                 case E_XC_HV_VECTOR:
10759                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_05_L, bEnable<<15 , BIT(15) );
10760                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, bEnable<<15 , BIT(15) );
10761                     break;
10762             }
10763         }
10764         else
10765         {
10766             switch(eVector_type)
10767             {
10768                 case E_XC_H_VECTOR:
10769                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_05_L, bEnable<<15 , BIT(15) );
10770                     break;
10771                 case E_XC_V_VECTOR:
10772                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_09_L, bEnable<<15 , BIT(15) );
10773                     break;
10774                 default:
10775                 case E_XC_HV_VECTOR:
10776                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_05_L, bEnable<<15 , BIT(15) );
10777                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_09_L, bEnable<<15 , BIT(15) );
10778                     break;
10779             }
10780         }
10781     }
10782     else if(eScaling_type == E_XC_POST_SCALING)
10783     {
10784         if(eWindow == MAIN_WINDOW)
10785         {
10786             switch(eVector_type)
10787             {
10788                 case E_XC_H_VECTOR:
10789                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_08_L, bEnable<<8 , BIT(8) );
10790                     break;
10791                 case E_XC_V_VECTOR:
10792                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_0A_L, bEnable<<8 , BIT(8) );
10793                     break;
10794                 default:
10795                 case E_XC_HV_VECTOR:
10796                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_08_L, bEnable<<8 , BIT(8) );
10797                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_0A_L, bEnable<<8 , BIT(8) );
10798                     break;
10799             }
10800         }
10801         else
10802         {
10803             switch(eVector_type)
10804             {
10805                 case E_XC_H_VECTOR:
10806                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_28_L, bEnable<<8 , BIT(8) );
10807                     break;
10808                 case E_XC_V_VECTOR:
10809                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_2A_L, bEnable<<8 , BIT(8) );
10810                     break;
10811                 default:
10812                 case E_XC_HV_VECTOR:
10813                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_28_L, bEnable<<8 , BIT(8) );
10814                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_2A_L, bEnable<<8 , BIT(8) );
10815                     break;
10816             }
10817         }
10818     }
10819     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10820 
10821 }
10822 
MApi_XC_SetScaling(MS_BOOL bEnable,E_XC_SCALING_TYPE eScaling_type,E_XC_VECTOR_TYPE eVector_type,SCALER_WIN eWindow)10823 void MApi_XC_SetScaling( MS_BOOL bEnable, E_XC_SCALING_TYPE eScaling_type, E_XC_VECTOR_TYPE eVector_type, SCALER_WIN eWindow )
10824 {
10825     if (pu32XCInst == NULL)
10826     {
10827         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10828         return;
10829     }
10830 
10831     stXC_SET_SCALING XCArgs;
10832     XCArgs.bEnable = bEnable;
10833     XCArgs.eScaling_type = eScaling_type;
10834     XCArgs.eVector_type = eVector_type;
10835     XCArgs.eWindow = eWindow;
10836 
10837     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_SCALING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10838     {
10839         printf("Obtain XC engine fail\n");
10840         return;
10841     }
10842     else
10843     {
10844         return;
10845     }
10846 }
10847 
10848 //-------------------------------------------------------------------------------------------------
10849 /// MApi_XC_SetMCDIBufferAddress
10850 /// @param  u32FBAddress                              \b IN: frame buffer base addr
10851 /// @param  u32FBSize                                   \b IN: frame buffer size
10852 /// @param  eType                                         \b IN: set frame buffer for MCDI ME1 or ME2
10853 //-------------------------------------------------------------------------------------------------
MApi_XC_SetMCDIBufferAddress_U2(void * pInstance,MS_PHY u32FBAddress,MS_PHY u32FBSize,E_XC_MCDI_TYPE eType)10854 void MApi_XC_SetMCDIBufferAddress_U2(void* pInstance, MS_PHY u32FBAddress, MS_PHY u32FBSize, E_XC_MCDI_TYPE eType)
10855 {
10856     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10857     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10858     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10859     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10860     _XC_ENTRY(pInstance);
10861     MDrv_SC_SetMCDIBufferAddress(pInstance, u32FBAddress, u32FBSize, eType);
10862     _XC_RETURN(pInstance);
10863     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10864     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10865 
10866 }
10867 
MApi_XC_SetMCDIBufferAddress(MS_PHY u32FBAddress,MS_PHY u32FBSize,E_XC_MCDI_TYPE eType)10868 void MApi_XC_SetMCDIBufferAddress(MS_PHY u32FBAddress, MS_PHY u32FBSize, E_XC_MCDI_TYPE eType)
10869 {
10870     if (pu32XCInst == NULL)
10871     {
10872         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10873         return;
10874     }
10875 
10876     stXC_SET_MCDI_BUFFERADDRESS XCArgs;
10877     XCArgs.u32FBAddress = u32FBAddress;
10878     XCArgs.u32FBSize = u32FBSize;
10879     XCArgs.eType = eType;
10880 
10881     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MCDI_BUFFERADDRESS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10882     {
10883         printf("Obtain XC engine fail\n");
10884         return;
10885     }
10886     else
10887     {
10888         return;
10889     }
10890 }
10891 
10892 //-------------------------------------------------------------------------------------------------
10893 /// MApi_XC_EnableMCDI
10894 /// @param  bEnable                                      \b IN: enable/disable MCDI
10895 /// @param  eType                                         \b IN: control MCDI ME1 or ME2 or both
10896 //-------------------------------------------------------------------------------------------------
MApi_XC_EnableMCDI_U2(void * pInstance,MS_BOOL bEnable,E_XC_MCDI_TYPE eType)10897 void MApi_XC_EnableMCDI_U2(void* pInstance, MS_BOOL bEnable, E_XC_MCDI_TYPE eType)
10898 {
10899     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10900     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10901     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10902     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
10903     _XC_ENTRY(pInstance);
10904     MDrv_SC_EnableMCDI(pInstance, bEnable, eType);
10905     _XC_RETURN(pInstance);
10906     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
10907 
10908     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10909 }
10910 
MApi_XC_EnableMCDI(MS_BOOL bEnable,E_XC_MCDI_TYPE eType)10911 void MApi_XC_EnableMCDI(MS_BOOL bEnable, E_XC_MCDI_TYPE eType)
10912 {
10913     if (pu32XCInst == NULL)
10914     {
10915         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10916         return;
10917     }
10918 
10919     stXC_SET_MCDI_ENABLE XCArgs;
10920     XCArgs.bEnable = bEnable;
10921     XCArgs.eType = eType;
10922 
10923     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_MCDI_ENABLE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10924     {
10925         printf("Obtain XC engine fail\n");
10926         return;
10927     }
10928     else
10929     {
10930         return;
10931     }
10932 }
10933 
10934 //-------------------------------------------------------------------------------------------------
10935 /// MApi_XC_SendCmdToFRC
10936 /// @param  u8Cmd                                      \b IN: CMD
10937 /// @param  count                                         \b IN: parameter Counter
10938 /// @param  pFRC_R2_Para                           \b IN: input parameter
10939 /// @return  TRUE if succeed, FALSE if failed
10940 //-------------------------------------------------------------------------------------------------
MApi_XC_SendCmdToFRC_U2(void * pInstance,MS_U8 u8Cmd,MS_U8 count,FRC_R2_CMD_PARAMETER_t pFRC_R2_Para)10941 MS_BOOL MApi_XC_SendCmdToFRC_U2( void* pInstance, MS_U8 u8Cmd, MS_U8 count, FRC_R2_CMD_PARAMETER_t pFRC_R2_Para )
10942 {
10943     MS_BOOL bret = FALSE;
10944     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
10945 
10946     bret = MDrv_XC_SendCmdToFRC(pInstance, u8Cmd, count, pFRC_R2_Para);
10947 
10948 #if (HW_DESIGN_3D_VER == 4)
10949     // for 2Dto3D case, the FRC FICLK need to be changed
10950     //E_MAPI_FRC_MB_CMD_SET_2D_TO_3D_MODE = 0x40,  ParaCnt=5,
10951     //          P0 = 2D to 3D ConversionMode(0=Disable, 1=Enable)
10952     //          P1 = 3D Depth Gain(0~31)
10953     //          P2 = 3D Depth Offset(0~127)
10954     //          P3 = Artificial Gain(0~15)
10955     //          P4 = L/R Swap (0=Normal, 1=L/R Swap)
10956     if(u8Cmd == 0x40)
10957     {
10958         if(pFRC_R2_Para.p1==ENABLE)
10959         {
10960             W2BYTEMSK(L_CLKGEN1(0x35), 0x0004, 0x0004); // clk_idclk_frc
10961             W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10962             W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10963         }
10964         else
10965         {
10966             W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0004); // clk_fdclk_frc
10967             W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
10968             W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
10969         }
10970     }
10971 #endif
10972     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
10973     return bret;
10974 }
10975 
MApi_XC_SendCmdToFRC(MS_U8 u8Cmd,MS_U8 count,FRC_R2_CMD_PARAMETER_t pFRC_R2_Para)10976 MS_BOOL MApi_XC_SendCmdToFRC( MS_U8 u8Cmd, MS_U8 count, FRC_R2_CMD_PARAMETER_t pFRC_R2_Para )
10977 {
10978     if (pu32XCInst == NULL)
10979     {
10980         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
10981         return FALSE;
10982     }
10983 
10984     stXC_SEND_CMD2FRC XCArgs;
10985     XCArgs.u8Cmd = u8Cmd;
10986     XCArgs.count = count;
10987     XCArgs.pFRC_R2_Para = pFRC_R2_Para;
10988     XCArgs.bReturnValue = FALSE;
10989 
10990     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SEND_CMD2FRC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
10991     {
10992         printf("Obtain XC engine fail\n");
10993         return FALSE;
10994     }
10995     else
10996     {
10997         return XCArgs.bReturnValue;
10998     }
10999 }
11000 
11001 //-------------------------------------------------------------------------------------------------
11002 /// MApi_XC_GetMsgFromFRC
11003 /// @param  u8Cmd                                      \b IN: CMD
11004 /// @param  pu8ParaCount                            \b IN: Counter
11005 /// @param  pu8Para                                     \b IN: input parameter
11006 /// @return  TRUE if succeed, FALSE if failed
11007 //-------------------------------------------------------------------------------------------------
MApi_XC_GetMsgFromFRC_U2(void * pInstance,MS_U8 * pu8Cmd,MS_U8 * pu8ParaCount,MS_U8 * pu8Para)11008 MS_BOOL MApi_XC_GetMsgFromFRC_U2(void* pInstance, MS_U8* pu8Cmd, MS_U8* pu8ParaCount, MS_U8* pu8Para)
11009 {
11010     MS_BOOL bret = FALSE;
11011     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11012 
11013     bret = MDrv_XC_GetMsgFromFRC(pInstance, pu8Cmd, pu8ParaCount, pu8Para);
11014     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11015     return bret;
11016 
11017 }
11018 
MApi_XC_GetMsgFromFRC(MS_U8 * pu8Cmd,MS_U8 * pu8ParaCount,MS_U8 * pu8Para)11019 MS_BOOL MApi_XC_GetMsgFromFRC(MS_U8* pu8Cmd, MS_U8* pu8ParaCount, MS_U8* pu8Para)
11020 {
11021     if (pu32XCInst == NULL)
11022     {
11023         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11024         return FALSE;
11025     }
11026 
11027     stXC_GET_MSG_FROM_FRC XCArgs;
11028     XCArgs.pu8Cmd = pu8Cmd;
11029     XCArgs.pu8ParaCount = pu8ParaCount;
11030     XCArgs.pu8Para = pu8Para;
11031     XCArgs.bReturnValue = FALSE;
11032 
11033     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_MSG_FROM_FRC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11034     {
11035         printf("Obtain XC engine fail\n");
11036         return FALSE;
11037     }
11038     else
11039     {
11040         return XCArgs.bReturnValue;
11041     }
11042 }
11043 
11044 //-------------------------------------------------------------------------------------------------
11045 /// set XC bandwidth saving X-mode
11046 /// @param  bEnable                   \b IN: enable or disable
11047 /// @param  eWindow                 \b IN: which window we are going to enable or disable
11048 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_BWS_Mode_U2(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)11049 void MApi_XC_Set_BWS_Mode_U2(void* pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
11050 {
11051     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11052     Hal_SC_set_bws_mode(pInstance, bEnable, eWindow);
11053     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11054 
11055 }
11056 
MApi_XC_Set_BWS_Mode(MS_BOOL bEnable,SCALER_WIN eWindow)11057 void MApi_XC_Set_BWS_Mode(MS_BOOL bEnable, SCALER_WIN eWindow)
11058 {
11059     if (pu32XCInst == NULL)
11060     {
11061         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11062         return;
11063     }
11064 
11065     stXC_SET_BWS_MODE XCArgs;
11066     XCArgs.bEnable = bEnable;
11067     XCArgs.eWindow = eWindow;
11068 
11069     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BWS_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11070     {
11071         printf("Obtain XC engine fail\n");
11072         return;
11073     }
11074     else
11075     {
11076         return;
11077     }
11078 }
11079 
11080 //-------------------------------------------------------------------------------------------------
11081 /// set xc FRC ColorPathCtrl
11082 /// @param  epath_type               \b IN: Select the path
11083 /// @param  bEnable                    \b IN: enable or disable
11084 //-------------------------------------------------------------------------------------------------
MApi_XC_FRC_ColorPathCtrl_U2(void * pInstance,MS_U16 u16Path_sel,MS_BOOL bEnable)11085 void MApi_XC_FRC_ColorPathCtrl_U2( void* pInstance, MS_U16 u16Path_sel, MS_BOOL bEnable)
11086 {
11087     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11088 
11089     if(u16Path_sel & FRC_PATHCTRL_OP2COLORMATRIX)
11090     {
11091         MDrv_FRC_OP2_ColorMatrixEn(pInstance, bEnable);
11092     }
11093     if(u16Path_sel & FRC_PATHCTRL_OP2CSCDITHER)
11094     {
11095         MDrv_FRC_OP2_CscDitherEn(pInstance, bEnable);
11096     }
11097     if(u16Path_sel & FRC_PATHCTRL_OP2BRIGHTNESS)
11098     {
11099         MDrv_FRC_OP2_BrightnessEn(pInstance, bEnable);
11100     }
11101     if(u16Path_sel & FRC_PATHCTRL_OP2CONTRAST)
11102     {
11103         MDrv_FRC_OP2_ContrastEn(pInstance, bEnable);
11104     }
11105     if(u16Path_sel & FRC_PATHCTRL_OP2NOISEROUND)
11106     {
11107         MDrv_FRC_OP2_NoiseRoundEn(pInstance, bEnable);
11108     }
11109 
11110     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11111 }
11112 
MApi_XC_FRC_ColorPathCtrl(MS_U16 u16Path_sel,MS_BOOL bEnable)11113 void MApi_XC_FRC_ColorPathCtrl( MS_U16 u16Path_sel, MS_BOOL bEnable)
11114 {
11115     if (pu32XCInst == NULL)
11116     {
11117         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11118         return;
11119     }
11120 
11121     stXC_SET_FRC_COLOR_PATH_CONTROL XCArgs;
11122     XCArgs.u16Path_sel = u16Path_sel;
11123     XCArgs.bEnable = bEnable;
11124 
11125     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FRC_COLOR_PATH_CONTROL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11126     {
11127         printf("Obtain XC engine fail\n");
11128         return;
11129     }
11130     else
11131     {
11132         return;
11133     }
11134 }
11135 
11136 //-------------------------------------------------------------------------------------------------
11137 /// set XC FRC_OP2 SetRGBGain
11138 /// @param  u16RedGain                 \b IN: Red Gain
11139 /// @param  u16GreenGain              \b IN: Green Gain
11140 /// @param  u16BlueGain                \b IN: Blue Gain
11141 //-------------------------------------------------------------------------------------------------
MApi_XC_FRC_OP2_SetRGBGain_U2(void * pInstance,MS_U16 u16RedGain,MS_U16 u16GreenGain,MS_U16 u16BlueGain)11142 void MApi_XC_FRC_OP2_SetRGBGain_U2(void* pInstance, MS_U16 u16RedGain, MS_U16 u16GreenGain, MS_U16 u16BlueGain)
11143 {
11144     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11145 
11146     MDrv_FRC_OP2_SetRGBGain(pInstance, u16RedGain,  u16GreenGain,  u16BlueGain);
11147     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11148 }
11149 
MApi_XC_FRC_OP2_SetRGBGain(MS_U16 u16RedGain,MS_U16 u16GreenGain,MS_U16 u16BlueGain)11150 void MApi_XC_FRC_OP2_SetRGBGain(MS_U16 u16RedGain, MS_U16 u16GreenGain, MS_U16 u16BlueGain)
11151 {
11152     if (pu32XCInst == NULL)
11153     {
11154         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11155         return;
11156     }
11157 
11158     stXC_SET_FRC_OP2_RGBGAIN XCArgs;
11159     XCArgs.u16RedGain = u16RedGain;
11160     XCArgs.u16GreenGain = u16GreenGain;
11161     XCArgs.u16BlueGain = u16BlueGain;
11162 
11163     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FRC_OP2_RGBGAIN, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11164     {
11165         printf("Obtain XC engine fail\n");
11166         return;
11167     }
11168     else
11169     {
11170         return;
11171     }
11172 }
11173 
11174 //-------------------------------------------------------------------------------------------------
11175 /// set XC FRC_OP2 SetRGBOffset
11176 /// @param  u16RedOffset                 \b IN: Red Offset
11177 /// @param  u16GreenOffset              \b IN: Green Offset
11178 /// @param  u16BlueOffset                \b IN: Blue Offset
11179 //-------------------------------------------------------------------------------------------------
MApi_XC_FRC_OP2_SetRGBOffset_U2(void * pInstance,MS_U16 u16RedOffset,MS_U16 u16GreenOffset,MS_U16 u16BlueOffset)11180 void MApi_XC_FRC_OP2_SetRGBOffset_U2(void* pInstance, MS_U16 u16RedOffset, MS_U16 u16GreenOffset, MS_U16 u16BlueOffset)
11181 {
11182     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11183 
11184     MDrv_FRC_OP2_SetRGBOffset(pInstance, u16RedOffset,  u16GreenOffset,  u16BlueOffset);
11185     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11186 }
11187 
MApi_XC_FRC_OP2_SetRGBOffset(MS_U16 u16RedOffset,MS_U16 u16GreenOffset,MS_U16 u16BlueOffset)11188 void MApi_XC_FRC_OP2_SetRGBOffset(MS_U16 u16RedOffset, MS_U16 u16GreenOffset, MS_U16 u16BlueOffset)
11189 {
11190     if (pu32XCInst == NULL)
11191     {
11192         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11193         return;
11194     }
11195 
11196     stXC_SET_FRC_OP2_RGBOFFSET XCArgs;
11197     XCArgs.u16RedOffset = u16RedOffset;
11198     XCArgs.u16GreenOffset = u16GreenOffset;
11199     XCArgs.u16BlueOffset = u16BlueOffset;
11200 
11201     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FRC_OP2_RGBOFFSET, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11202     {
11203         printf("Obtain XC engine fail\n");
11204         return;
11205     }
11206     else
11207     {
11208         return;
11209     }
11210 }
11211 
11212 //-------------------------------------------------------------------------------------------------
11213 /// set XC FRC_OP2 SetDither
11214 /// @param  u16dither                 \b IN: Dither setting
11215 //-------------------------------------------------------------------------------------------------
MApi_XC_FRC_OP2_SetDither_U2(void * pInstance,MS_U16 u16dither)11216 void MApi_XC_FRC_OP2_SetDither_U2(void* pInstance, MS_U16 u16dither)
11217 {
11218     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11219 
11220     MDrv_FRC_OP2_SetDither(pInstance, u16dither);
11221     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11222 }
11223 
MApi_XC_FRC_OP2_SetDither(MS_U16 u16dither)11224 void MApi_XC_FRC_OP2_SetDither(MS_U16 u16dither)
11225 {
11226     if (pu32XCInst == NULL)
11227     {
11228         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11229         return;
11230     }
11231 
11232     stXC_SET_FRC_OP2_DITHER XCArgs;
11233     XCArgs.u16dither = u16dither;
11234 
11235     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FRC_OP2_DITHER, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11236     {
11237         printf("Obtain XC engine fail\n");
11238         return;
11239     }
11240     else
11241     {
11242         return;
11243     }
11244 }
11245 
11246 //-------------------------------------------------------------------------------------------------
11247 /// MApi_XC_ForceReadFrame
11248 /// @param  bEnable                                 \b IN: enable/disable keep specified frame
11249 /// @param  u16FrameIndex                           \b IN: control specified frame to show
11250 //-------------------------------------------------------------------------------------------------
MApi_XC_ForceReadFrame_U2(void * pInstance,MS_BOOL bEnable,MS_U16 u16FrameIndex)11251 E_APIXC_ReturnValue MApi_XC_ForceReadFrame_U2(void* pInstance, MS_BOOL bEnable, MS_U16 u16FrameIndex)
11252 {
11253     E_APIXC_ReturnValue bRet = E_APIXC_RET_FAIL;
11254     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
11255 
11256     _XC_ENTRY(pInstance);
11257 
11258     bRet = MDrv_SC_ForceReadFrame(pInstance, bEnable, u16FrameIndex);
11259 
11260     _XC_RETURN(pInstance);
11261     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11262 
11263     return bRet;
11264 }
11265 
MApi_XC_ForceReadFrame(MS_BOOL bEnable,MS_U16 u16FrameIndex)11266 E_APIXC_ReturnValue MApi_XC_ForceReadFrame(MS_BOOL bEnable, MS_U16 u16FrameIndex)
11267 {
11268     if (pu32XCInst == NULL)
11269     {
11270         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11271         return E_APIXC_RET_FAIL;
11272     }
11273 
11274     stXC_SET_FORCE_READ_FRAME XCArgs;
11275     XCArgs.bEnable = bEnable;
11276     XCArgs.u16FrameIndex = u16FrameIndex;
11277     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
11278 
11279     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FORCE_READ_FRAME, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11280     {
11281         printf("Obtain XC engine fail\n");
11282         return E_APIXC_RET_FAIL;
11283     }
11284     else
11285     {
11286         return XCArgs.eReturnValue;
11287     }
11288 }
11289 
11290 
MApi_XC_OSDC_InitSetting_U2(void * pInstance,E_XC_OSDC_TGEN_Type e_osdctgen_type,MS_XC_OSDC_TGEN_INFO * pstOC_Tgen_Cus,MS_XC_OSDC_CTRL_INFO * pstOC_Ctrl)11291 E_APIXC_ReturnValue MApi_XC_OSDC_InitSetting_U2(void* pInstance,
11292                                                E_XC_OSDC_TGEN_Type e_osdctgen_type,
11293                                                MS_XC_OSDC_TGEN_INFO *pstOC_Tgen_Cus,
11294                                                MS_XC_OSDC_CTRL_INFO *pstOC_Ctrl)
11295 {
11296 
11297     if(!SUPPORT_OSD_HSLVDS_PATH)
11298     {
11299         printf("Please check the osdc capability \n");
11300         return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
11301     }
11302     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11303     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11304     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11305 
11306     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11307     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11308 
11309     gSrcInfo[MAIN_WINDOW].Status2.bIsInitOSDC = TRUE;
11310 
11311     if(e_osdctgen_type == E_XC_OSDC_TGEN_MANUAL)
11312     {
11313         if(NULL == pstOC_Tgen_Cus)
11314         {
11315             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11316             return E_APIXC_RET_FAIL_INVALID_PARAMETER;
11317         }
11318 
11319         memcpy(&gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING, pstOC_Tgen_Cus, sizeof(MS_XC_OSDC_TGEN_INFO));
11320         memcpy(&gSrcInfo[MAIN_WINDOW].Status2.stXCOSDC_CTRL,  pstOC_Ctrl,     sizeof(MS_XC_OSDC_CTRL_INFO));
11321     }
11322     else
11323     {
11324         switch(e_osdctgen_type)
11325         {
11326             case E_XC_OSDC_TGEN_1366x768:
11327                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0x618;
11328                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x326;
11329 
11330                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11331                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11332                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11333                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0x589;
11334 
11335                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11336                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11337                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11338                 gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = 0x309;
11339                 break;
11340 
11341             case E_XC_OSDC_TGEN_1920x1080:
11342                 if(pstOC_Ctrl->u16OC_Lpll_type == E_XC_PNL_LPLL_HS_LVDS)
11343                 {
11344                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0x7B4; //0x800;
11345                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x448; //0x500;
11346 
11347                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11348                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11349                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11350                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0x7B3;
11351 
11352                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11353                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11354                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11355                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = 0x447;
11356                 }
11357                 else
11358                 {
11359                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0x7FF; //should be odd(total cycle: htt+1),
11360                                                                                                    //vby one tx need even
11361                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x500;
11362 
11363                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11364                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11365                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11366                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0x7B3;
11367 
11368                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11369                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11370                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11371                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = 0x447;
11372 
11373                 }
11374                 break;
11375             case E_XC_OSDC_TGEN_3840x2160:
11376                 if(pstOC_Ctrl->u16OC_Lpll_type == E_XC_PNL_LPLL_HS_LVDS)
11377                 {
11378                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0xFFF;
11379                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x982;//0xA00;
11380 
11381                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11382                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11383                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11384                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0xF33;
11385 
11386                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11387                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11388                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11389                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = 0x87F;
11390                 }
11391                 else
11392                 {
11393                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0x10FF;
11394                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x900;//0xA00;
11395 
11396                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11397                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11398                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11399                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0xF33;
11400 
11401                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11402                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11403                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11404                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = 0x87F;
11405                 }
11406                 break;
11407 
11408             case E_XC_OSDC_TGEN_3840x1080:
11409                 if(pstOC_Ctrl->u16OC_Lpll_type == E_XC_PNL_LPLL_HS_LVDS)
11410                 {
11411                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0xFFF;
11412                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x982/2;//0xA00;
11413 
11414                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11415                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11416                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11417                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0xF33;
11418 
11419                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11420                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11421                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11422                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = (0x87F+1)/2-1;
11423                 }
11424                 else
11425                 {
11426                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HTotal        = 0x10FF;
11427                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VTotal        = 0x900/2;//0xA00;
11428 
11429                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_Start   = 0x04;
11430                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Hsync_End     = 0x06;
11431                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_Start = 0x34;
11432                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_HframDE_End   = 0xF33;
11433 
11434                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_Start   = 0x04;
11435                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_Vsync_End     = 0x06;
11436                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_Start = 0x10;
11437                     gSrcInfo[MAIN_WINDOW].Status2.stXCOSDCTIMING.u16OC_Tgen_VframDE_End   = (0x87F+1)/2-1+8;
11438                 }
11439                 break;
11440 
11441             case E_XC_OSDC_TGEN_MAX:
11442             default:
11443                 break;
11444         }
11445         memcpy(&gSrcInfo[MAIN_WINDOW].Status2.stXCOSDC_CTRL, pstOC_Ctrl, sizeof(MS_XC_OSDC_CTRL_INFO));
11446     }
11447     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11448     return E_APIXC_RET_OK;
11449 }
11450 
MApi_XC_OSDC_InitSetting(E_XC_OSDC_TGEN_Type e_osdctgen_type,MS_XC_OSDC_TGEN_INFO * pstOC_Tgen_Cus,MS_XC_OSDC_CTRL_INFO * pstOC_Ctrl)11451 E_APIXC_ReturnValue MApi_XC_OSDC_InitSetting(E_XC_OSDC_TGEN_Type e_osdctgen_type,
11452                                              MS_XC_OSDC_TGEN_INFO *pstOC_Tgen_Cus,
11453                                              MS_XC_OSDC_CTRL_INFO *pstOC_Ctrl)
11454 {
11455     if (pu32XCInst == NULL)
11456     {
11457         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11458         return E_APIXC_RET_FAIL;
11459     }
11460 
11461     stXC_OSDC_INITSETTING XCArgs;
11462     XCArgs.e_osdctgen_type = e_osdctgen_type;
11463     XCArgs.pstOC_Tgen_Cus = pstOC_Tgen_Cus;
11464     XCArgs.pstOC_Ctrl = pstOC_Ctrl;
11465     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
11466 
11467     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OSDC_INITSETTING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11468     {
11469         printf("Obtain XC engine fail\n");
11470         return E_APIXC_RET_FAIL;
11471     }
11472     else
11473     {
11474         return XCArgs.eReturnValue;
11475     }
11476 }
11477 
MApi_XC_OSDC_SetOutVfreqx10_U2(void * pInstance,MS_U16 u16Vfreq)11478 void MApi_XC_OSDC_SetOutVfreqx10_U2(void* pInstance, MS_U16 u16Vfreq)
11479 {
11480     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11481     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11482     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11483 
11484     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11485     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11486     pXCResourcePrivate->stdrvXC_MVideo.OSDC_FREQ = u16Vfreq;
11487     printf("OSDC_FREQ=%u\n",pXCResourcePrivate->stdrvXC_MVideo.OSDC_FREQ);
11488     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11489 }
11490 
MApi_XC_OSDC_SetOutVfreqx10(MS_U16 u16Vfreq)11491 void MApi_XC_OSDC_SetOutVfreqx10(MS_U16 u16Vfreq)
11492 {
11493     if (pu32XCInst == NULL)
11494     {
11495         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11496         return;
11497     }
11498 
11499     stXC_OSDC_SET_OUTPUTVFREQX10 XCArgs;
11500     XCArgs.u16Vfreq = u16Vfreq;
11501 
11502     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OSDC_SET_OUTPUTVFREQX10, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11503     {
11504         printf("Obtain XC engine fail\n");
11505         return;
11506     }
11507     else
11508     {
11509         return;
11510     }
11511 }
11512 
MApi_XC_OSDC_Control_U2(void * pInstance,MS_U32 eCtrl_type)11513 E_APIXC_ReturnValue MApi_XC_OSDC_Control_U2(void* pInstance, MS_U32 eCtrl_type)
11514 {
11515     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
11516     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11517     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11518     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11519     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11520     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11521 //    MS_U8 u8LPLL_Type = 0;
11522 //    u8LPLL_Type =(MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
11523 
11524     eReturn  = MDrv_XC_OSDC_Control(pInstance, eCtrl_type);
11525 
11526     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11527     return eReturn;
11528 }
11529 
MApi_XC_OSDC_Control(MS_U32 eCtrl_type)11530 E_APIXC_ReturnValue MApi_XC_OSDC_Control(MS_U32 eCtrl_type)
11531 {
11532     if (pu32XCInst == NULL)
11533     {
11534         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11535         return E_APIXC_RET_FAIL;
11536     }
11537 
11538     stXC_OSDC_CONTROL XCArgs;
11539     XCArgs.eCtrl_type = eCtrl_type;
11540     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
11541 
11542     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OSDC_CONTROL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11543     {
11544         printf("Obtain XC engine fail\n");
11545         return E_APIXC_RET_FAIL;
11546     }
11547     else
11548     {
11549         return XCArgs.eReturnValue;
11550     }
11551 }
11552 
MApi_XC_OSDC_GetDstInfo_U2(void * pInstance,MS_OSDC_DST_DispInfo * pDstInfo,MS_U32 u32SizeofDstInfo)11553 E_APIXC_ReturnValue MApi_XC_OSDC_GetDstInfo_U2(void* pInstance, MS_OSDC_DST_DispInfo *pDstInfo, MS_U32 u32SizeofDstInfo)
11554 {
11555     MS_XC_OSDC_TGEN_INFO stOC_Tgen;
11556     MS_XC_OSDC_CTRL_INFO stOC_Ctrl;
11557 
11558     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
11559 
11560     if(NULL == pDstInfo)
11561     {
11562         printf("MApi_XC_OSDC_GetDstInfo():pDstInfo is NULL\n");
11563         return E_APIXC_RET_FAIL;
11564     }
11565     else if(u32SizeofDstInfo != sizeof(MS_OSDC_DST_DispInfo))
11566     {
11567         printf("MApi_XC_OSDC_GetDstInfo():u16SizeofDstInfo is different from the MS_XC_OSDC_DST_DispInfo defined, check header file!\n");
11568         return E_APIXC_RET_FAIL;
11569     }
11570 
11571     // the version control is coming in with version 1
11572     if(pDstInfo->ODSC_DISPInfo_Version < 1)
11573     {
11574         //We consider compatible operation form version1 , so reject the info init when version invalid
11575         XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MApi_XC_OSDC_GetDstInfo: please check your ODSC_DISPInfo_Version, it should not set to 0!!\n")
11576         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
11577 
11578         return E_APIXC_RET_FAIL;
11579     }
11580 
11581     if(MDrv_XC_OSDC_GetDataFromRegister(pInstance, &stOC_Tgen, &stOC_Ctrl))
11582     {
11583         pDstInfo->VDTOT                = stOC_Tgen.u16OC_Tgen_VTotal;
11584         pDstInfo->DEVST                = stOC_Tgen.u16OC_Tgen_VframDE_Start;
11585         pDstInfo->DEVEND               = stOC_Tgen.u16OC_Tgen_VframDE_End;
11586         pDstInfo->HDTOT                = stOC_Tgen.u16OC_Tgen_HTotal;
11587         pDstInfo->DEHST                = stOC_Tgen.u16OC_Tgen_HframDE_Start;
11588         pDstInfo->DEHEND               = stOC_Tgen.u16OC_Tgen_HframDE_End;
11589 
11590         pDstInfo->SYNCHST              = stOC_Tgen.u16OC_Tgen_Hsync_Start;
11591         pDstInfo->SYNCHEND             = stOC_Tgen.u16OC_Tgen_Hsync_End;
11592         pDstInfo->SYNCVST              = stOC_Tgen.u16OC_Tgen_Vsync_Start;
11593         pDstInfo->SYNCVEND             = stOC_Tgen.u16OC_Tgen_Vsync_End;
11594 
11595         pDstInfo->bCLK_EN              = stOC_Ctrl.bOC_ClK_En;
11596         pDstInfo->bMIXER_BYPASS_EN     = stOC_Ctrl.bOC_Mixer_Bypass_En;
11597         pDstInfo->bMIXER_INVALPHA_EN   = stOC_Ctrl.bOC_Mixer_InvAlpha_En;
11598         pDstInfo->bMIXER_HSTVFDEOUT_EN = stOC_Ctrl.bOC_Mixer_Hsync_Vfde_Out;
11599         pDstInfo->bMIXER_HFDEVFDEOUT_EN= stOC_Ctrl.bOC_Mixer_Hfde_Vfde_Out;
11600 
11601         eRet = E_APIXC_RET_OK;
11602     }
11603     else
11604     {
11605         pDstInfo->VDTOT                = 0;
11606         pDstInfo->HDTOT                = 0;
11607         pDstInfo->DEHST                = 0;
11608         pDstInfo->DEHEND               = 0;
11609         pDstInfo->DEVST                = 0;
11610         pDstInfo->DEVEND               = 0;
11611 
11612         pDstInfo->SYNCHST              = 0;
11613         pDstInfo->SYNCHEND             = 0;
11614         pDstInfo->SYNCVST              = 0;
11615         pDstInfo->SYNCVEND             = 0;
11616 
11617         pDstInfo->bCLK_EN              = DISABLE;
11618         pDstInfo->bMIXER_BYPASS_EN     = DISABLE;
11619         pDstInfo->bMIXER_INVALPHA_EN   = DISABLE;
11620         pDstInfo->bMIXER_HSTVFDEOUT_EN = DISABLE;
11621         pDstInfo->bMIXER_HFDEVFDEOUT_EN= DISABLE;
11622 
11623         eRet = E_APIXC_RET_FAIL;
11624     }
11625 
11626     return eRet;
11627 }
11628 
MApi_XC_OSDC_GetDstInfo(MS_OSDC_DST_DispInfo * pDstInfo,MS_U32 u32SizeofDstInfo)11629 E_APIXC_ReturnValue MApi_XC_OSDC_GetDstInfo(MS_OSDC_DST_DispInfo *pDstInfo, MS_U32 u32SizeofDstInfo)
11630 {
11631     if (pu32XCInst == NULL)
11632     {
11633         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
11634         return E_APIXC_RET_FAIL;
11635     }
11636 
11637     stXC_OSDC_GET_DESTINATION_INFO XCArgs;
11638     XCArgs.pDstInfo = pDstInfo;
11639     XCArgs.u32SizeofDstInfo = u32SizeofDstInfo;
11640     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
11641 
11642     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OSDC_GET_DESTINATION_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
11643     {
11644         printf("Obtain XC engine fail\n");
11645         return E_APIXC_RET_FAIL;
11646     }
11647     else
11648     {
11649         return XCArgs.eReturnValue;
11650     }
11651 }
11652 
11653 #define LOGTIMECOST  FALSE
_MApi_XC_PCMonitor_Exe(void * pInstance,SCALER_WIN eWindow,INPUT_SOURCE_TYPE_t enInputSourceType)11654 XC_PCMONITOR_STATUS _MApi_XC_PCMonitor_Exe(void* pInstance, SCALER_WIN eWindow, INPUT_SOURCE_TYPE_t enInputSourceType)
11655 {
11656     MApi_XC_PCMonitor_Restart_U2(pInstance,eWindow);
11657 
11658     MS_U32 u32maxRetryTime = 30;
11659     XC_PCMONITOR_STATUS enPCMonitorStatus = E_XC_PCMONITOR_STABLE_NOSYNC;
11660     while ( enPCMonitorStatus != E_XC_PCMONITOR_STABLE_SYNC )
11661     {
11662         if(u32maxRetryTime == 0)
11663         {
11664             printf("\033[1;31mRetry Time out.Signal Unstable or No Signal!!\033[0m\n");
11665             break;
11666         }
11667 
11668         enPCMonitorStatus = MApi_XC_PCMonitor_U2(pInstance,enInputSourceType, eWindow);
11669 
11670         if(enPCMonitorStatus == E_XC_PCMONITOR_STABLE_SYNC)
11671         {
11672             printf("Signal Stable!!\n");
11673             break;
11674         }
11675 
11676         MsOS_DelayTask(10);
11677         u32maxRetryTime--;
11678     }
11679     return enPCMonitorStatus;
11680 }
11681 
MApi_XC_SetPowerState_U2(void * pInstance,EN_POWER_MODE enPowerState)11682 MS_U32 MApi_XC_SetPowerState_U2(void* pInstance, EN_POWER_MODE enPowerState)
11683 {
11684     MS_U32 u32Ret = UTOPIA_STATUS_FAIL;
11685     MS_U8 i = 0;
11686     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11687     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11688 #ifndef MSOS_TYPE_OPTEE
11689     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11690 #else
11691     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
11692 #endif
11693 
11694 #if LOGTIMECOST
11695     MS_U32 u32Begin = MsOS_GetSystemTime();
11696 #endif
11697 #ifndef MSOS_TYPE_OPTEE
11698     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11699     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11700     if (enPowerState == E_POWER_SUSPEND)
11701     {
11702         pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState = enPowerState;
11703         pXCResourcePrivate->stdrvXC_MVideo._bSkipSWReset = FALSE;
11704 #if (HW_DESIGN_4K2K_VER == 7)
11705         pXCResourcePrivate->sthal_SC.u16Sc1HvspFilterValue = E_XC_UNSET;
11706 #endif
11707 
11708 #ifdef MSOS_TYPE_LINUX_KERNEL
11709         // Because of in linux kernel mode, XC can do STR without XC_init.
11710         // Get IO_Base again for protecting
11711         // (NG flow: without XC init => do STR => kernel call XCStr callback
11712         // => call MApi_XC_SetPowerState_U2
11713         // => No _XC_RIU_BASE)
11714         if (_XC_RIU_BASE == 0)
11715         {
11716             if (MDrv_XC_SetIOMapBase_i(pInstance) != TRUE)
11717             {
11718                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "MApi_XC_Init MDrv_XC_SetIOMapBase() failure\n");
11719             }
11720             MDrv_XC_SetDeviceOffset(pInstance);
11721         }
11722 #endif
11723 
11724 #if (HW_DESIGN_4K2K_VER == 7)
11725         //Temp delete path when STR(need to refine msAPI)
11726         INPUT_SOURCE_TYPE_t oldMainSource = pXCResourcePrivate->stdrvXC_MVideo.enOldInputSrc_ForScalerSetSource[MAIN_WINDOW];
11727         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11728         MApi_XC_Mux_DeletePath_U2(pInstance, oldMainSource, OUTPUT_SCALER_MAIN_WINDOW);
11729         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11730 #endif
11731 
11732         #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6) && MANHATTAN_GOP_HW_BUG_PATCH)
11733         // For manhattan
11734         pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled = FALSE;
11735         pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled = FALSE;
11736         _MLOAD_ENTRY(pInstance);
11737         MHal_FRC_AdjustGOPPosition(pInstance);
11738         MDrv_XC_MLoad_Fire(pInstance,TRUE);
11739         _MLOAD_RETURN(pInstance);
11740         #endif
11741         MDrv_XC_MLoad_Enable(pInstance,  FALSE);
11742 
11743         //DISABLE Interrupt
11744         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
11745         {
11746             MsOS_DisableInterrupt(E_INT_IRQ_DISP);
11747         }
11748         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
11749         {
11750             MsOS_DisableInterrupt(E_INT_IRQ_EC_BRIDGE);
11751             MsOS_DisableInterrupt(E_INT_IRQ_DISP1);
11752         }
11753         MDrv_SC_set_interrupt(pInstance, SC_INT_VSINT, DISABLE); //Mask Output Vsync for Hanging issue for CPU to bussy (Mantis 1180314)
11754 #if 0
11755 #ifndef MSOS_TYPE_LINUX_KERNEL
11756         // Release ISR
11757         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
11758         {
11759         MsOS_DetachInterrupt(E_INT_IRQ_DISP);
11760         }
11761         else if(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
11762         {
11763             MsOS_DetachInterrupt(E_INT_IRQ_EC_BRIDGE);
11764             MsOS_DetachInterrupt(E_INT_IRQ_DISP1);
11765         }
11766 #endif
11767 #endif
11768 
11769 #ifdef MSOS_TYPE_LINUX_KERNEL
11770         /*
11771         ** Save setwindow info for str
11772         */
11773         void *pModule;
11774         UtopiaInstanceGetModule(pInstance, &pModule);
11775         XC_REGS_SAVE_AREA *pXCResourceStr = NULL;
11776         UtopiaModuleGetSTRPrivate(pModule, (void**)&pXCResourceStr);
11777 
11778         MDrv_XC_ADC_GetGainSetting(pInstance, &(pXCResourceStr->stADCSetting));
11779 
11780         //get signal status
11781         XC_IP_SYNC_STATUS  sXC_Sync_Status = {0};
11782         MDrv_XC_GetSyncStatus(pInstance,gSrcInfo[MAIN_WINDOW].enInputSourceType,&sXC_Sync_Status,MAIN_WINDOW);
11783         if((sXC_Sync_Status.u8SyncStatus & XC_MD_HSYNC_LOSS_BIT)||(sXC_Sync_Status.u8SyncStatus & XC_MD_VSYNC_LOSS_BIT))
11784         {
11785             pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
11786         }
11787         else
11788         {
11789             if (  ((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM])!=0)
11790                 ||((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM])!=0))
11791             {
11792                 pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = TRUE;
11793             }
11794             else
11795             {
11796                 // signal stable,but cma buff is not allocated.
11797                 // setwindow will be done when str resume.
11798                 pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
11799             }
11800         }
11801 #endif
11802         u32Ret = UTOPIA_STATUS_SUCCESS;
11803     }
11804     else if (enPowerState == E_POWER_RESUME)
11805     {
11806         if (pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState == E_POWER_SUSPEND)
11807         {
11808             pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW] = 0xFFFFFFFF;
11809             pXCResourcePrivate->stdrvXC_Scaling._au32PreFBSize[MAIN_WINDOW] = 0x0;
11810             pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[SUB_WINDOW] = 0xFFFFFFFF;
11811             pXCResourcePrivate->stdrvXC_Scaling._au32PreFBSize[SUB_WINDOW] = 0x0;
11812             pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW] = 0xFFFFFFFF;
11813             pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBSize[MAIN_WINDOW] = 0x0;
11814             pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[SUB_WINDOW] = 0xFFFFFFFF;
11815             pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBSize[SUB_WINDOW] = 0x0;
11816 
11817             #if FRC_INSIDE
11818             pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited = FALSE;
11819             #endif
11820 
11821             for(i = 0; i < MAX_WINDOW; i++)
11822             {
11823                 MDrv_SC_GenerateBlackVideo(pInstance, TRUE, (SCALER_WIN)i);
11824             }
11825 
11826             _MApi_XC_Init_WithoutCreateMutex(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32InitDataLen_Suspend);
11827 
11828             MDrv_XC_OSDC_Control(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32OSDCCtrltype_Suspend);
11829 
11830             MDrv_XC_Init_MISC(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32InitMiscDataLen_Suspend);
11831 
11832             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MLoadBufByteLen_Suspend > 0)
11833             {
11834 #if (SUPPORT_KERNEL_MLOAD == 1)
11835                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11836                 //dc on should do menuload init
11837                 pXCResourcePrivate->stdrvXC_MVideo_Context.stdrvXC_Menuload[psXCInstPri->u32DeviceID].g_bMLoadInitted = FALSE;
11838                 MApi_XC_MLoad_Init_U2(pInstance,
11839                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MLoadPhyAddr_Suspend,
11840                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MLoadBufByteLen_Suspend);
11841                 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
11842 #else
11843                 _MLOAD_ENTRY(pInstance);
11844                 //dc on should do menuload init
11845                 pXCResourcePrivate->stdrvXC_MVideo_Context.stdrvXC_Menuload[psXCInstPri->u32DeviceID].g_bMLoadInitted = FALSE;
11846                 MDrv_XC_MLoad_Init(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MLoadPhyAddr_Suspend);
11847                 _MLOAD_RETURN(pInstance);
11848 #endif
11849             }
11850 
11851             for(i = 0; i < E_XC_MCDI_MAX; i++)
11852             {
11853                 if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MCDIFBSize_Suspend[i] > 0) && (i < E_XC_MCDI_SUB_BOTH))
11854                 {
11855                     pXCResourcePrivate->stdrvXC_Display._u32MCDIFBAddress[i]=0xFFFFFFFF;
11856                     pXCResourcePrivate->stdrvXC_Display._u32MCDIFBSize[i]=0x0;
11857                     MDrv_SC_SetMCDIBufferAddress(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MCDIFBAddress_Suspend[i],
11858                                                  pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MCDIFBSize_Suspend[i],
11859                                                  (E_XC_MCDI_TYPE)i);
11860                 }
11861                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bEnableMCDI_Suspend[i])
11862                 {
11863                     MDrv_SC_EnableMCDI(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_bEnableMCDI_Suspend[i], (E_XC_MCDI_TYPE)i);
11864                 }
11865             }
11866 
11867             for(i = 0; i < MAX_WINDOW; i++)
11868             {
11869                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_u8DispWindowColor_Suspend[i] > 0)
11870                 {
11871                     MDrv_XC_SetDispWindowColor(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u8DispWindowColor_Suspend[i], (SCALER_WIN)i);
11872                 }
11873             }
11874 
11875             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32FrameColor_Suspend > 0)
11876             {
11877                 MDrv_XC_SetFrameColor(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32FrameColor_Suspend);
11878             }
11879 
11880 #ifndef MSOS_TYPE_LINUX_KERNEL
11881             MDrv_SC_SetSkipWaitVsync(pInstance, MAIN_WINDOW, TRUE);
11882             MDrv_SC_SetSkipWaitVsync(pInstance, SUB_WINDOW , TRUE);
11883 #endif
11884 
11885             for(i = 0; i < MAX_WINDOW; i++)
11886             {
11887 
11888 #ifdef MSOS_TYPE_LINUX_KERNEL
11889                 MDrv_SC_GenerateBlackVideo(pInstance, TRUE, (SCALER_WIN)i);
11890 #else
11891                 MDrv_SC_GenerateBlackVideo(pInstance, gSrcInfo[i].bBlackscreenEnabled, (SCALER_WIN)i);
11892 #endif
11893             }
11894 
11895 #ifndef MSOS_TYPE_LINUX_KERNEL
11896             MDrv_SC_SetSkipWaitVsync(pInstance, MAIN_WINDOW, FALSE);
11897             MDrv_SC_SetSkipWaitVsync(pInstance, SUB_WINDOW , FALSE);
11898 #endif
11899 
11900             #if (LD_ENABLE == 1)
11901             // Local Dimming Recovery procedure
11902             // In Local Dimming situation, we don't know if AP has a mmap for Local Dimming
11903             // we can only judge it by checking if it is inited so we will try to resume.
11904             if (pXCResourcePrivate->stdrv_LD._bMDrvLD_InitFinished == TRUE)
11905             {
11906                 MDrv_XC_LD_Set_MIUSel(pInstance, pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u8MIU);
11907 
11908                 MDrv_XC_LD_SetMemoryAddress(pInstance, pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32LDFReadBuf0Base,
11909                                             pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32LDFReadBuf1Base,
11910                                             pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32LDBWriteBuf0Base,
11911                                             pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32LDBWriteBuf1Base,
11912                                             pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32Edge2DCoeffBase,
11913                                             (pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32SPIDataBuf0Base
11914                                              -pXCResourcePrivate->stdrv_LD.gsLDDramBaseAddr.u32LDBWriteBuf0Base));
11915 
11916                 MDrv_XC_LD_Init(pInstance, pXCResourcePrivate->stdrv_LD._enLDPanelType);
11917 
11918                 // Must call or otherwise our local dimming report value will be only 1 pixel
11919                 // but actually we want it to be the whole screen so we divided it into 32*18 areas of the panel screen.
11920                 MS_U8 u8LDData[576] = {0};
11921                 MDrv_LD_Get_Value(pInstance, u8LDData, 32, 18);
11922             }
11923 #endif
11924 #ifdef UFO_XC_HDR
11925 #if (UFO_XC_HDR_VERSION == 2)
11926             if(pXCResourcePrivate->stdrvXC_Display._stDMAInitInfo.phyBaseAddr != NULL)
11927             {
11928                 MDrv_XC_HDR_Control(pInstance, E_XC_HDR_CTRL_INIT_DMA, (void*) &pXCResourcePrivate->stdrvXC_Display._stDMAInitInfo);
11929             }
11930 #endif
11931 #endif
11932             //pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState = enPowerState;
11933 
11934 #ifdef MSOS_TYPE_LINUX_KERNEL
11935             if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
11936             {
11937                 void *pModule;
11938                 _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
11939                 //****************to do :  add
11940                 /* Get Str Resource*/
11941                 UtopiaInstanceGetModule(pInstance, &pModule);
11942                 XC_REGS_SAVE_AREA *pXCResourceStr = NULL;
11943                 UtopiaModuleGetSTRPrivate(pModule, (void**)&pXCResourceStr);
11944                 /*1.create_mux,*/
11945                 MS_S16 s16PathId;
11946                 INPUT_SOURCE_TYPE_t currentSrc[MAX_WINDOW];
11947                 //get path data from shm
11948                 memset(&pXCResourceStr->Path_Info[0],0,sizeof(XC_MUX_PATH_INFO)*MAX_DATA_PATH_SUPPORTED);
11949                 for(i=0;i<MAX_DATA_PATH_SUPPORTED;i++)
11950                 {
11951                     if(pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus & DATA_PATH_USING)
11952                     {
11953                         pXCResourceStr->Path_Info[i].Path_Type                 = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].e_PathType;
11954                         pXCResourceStr->Path_Info[i].src                       = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].src;
11955                         pXCResourceStr->Path_Info[i].dest                      = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest;
11956                         pXCResourceStr->Path_Info[i].path_thread               = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].path_thread;
11957                         pXCResourceStr->Path_Info[i].SyncEventHandler          = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].synchronous_event_handler;
11958                         pXCResourceStr->Path_Info[i].DestOnOff_Event_Handler   = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_on_off_event_handler;
11959                         pXCResourceStr->Path_Info[i].dest_periodic_handler     = pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].dest_periodic_handler;
11960                         pXCResourceStr->u8PathStatus[i]                         =  pXCResourcePrivate->stdrvXC_MVideo.s_InputSource_Mux_attr.Mux_DataPaths[i].u8PathStatus;
11961                         s16PathId = MApi_XC_Mux_DeletePath_U2(pInstance,pXCResourceStr->Path_Info[i].src, pXCResourceStr->Path_Info[i].dest);
11962                         if(s16PathId >=0)
11963                         {
11964                             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE,"Delete Path Success !!\n");
11965                             s16PathId = MApi_XC_Mux_CreatePath_U2(pInstance,&(pXCResourceStr->Path_Info[i]), sizeof(XC_MUX_PATH_INFO) );
11966                             if(s16PathId != -1)
11967                             {
11968                                 if( MApi_XC_Mux_EnablePath_U2(pInstance,s16PathId) != -1 )
11969                                 {
11970                                     if(pXCResourceStr->Path_Info[i].dest == OUTPUT_SCALER_MAIN_WINDOW)
11971                                     {
11972                                         MApi_XC_SetInputSource_U2(pInstance,pXCResourceStr->Path_Info[i].src, MAIN_WINDOW);
11973                                         currentSrc[MAIN_WINDOW] = pXCResourceStr->Path_Info[i].src;
11974                                     }
11975                                     else if((pXCResourceStr->Path_Info[i].dest == OUTPUT_SCALER_SUB_WINDOW)&&pXCResourceStr->bPIP_enable)
11976                                     {
11977                                         MApi_XC_SetInputSource_U2(pInstance,pXCResourceStr->Path_Info[i].src, SUB_WINDOW);
11978                                         currentSrc[SUB_WINDOW] = pXCResourceStr->Path_Info[i].src;
11979                                     }
11980                                     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE," Enable Path Success \n");
11981                                 }
11982                                 else
11983                                 {
11984                                     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE," Enable Path Error \n");
11985                                     u32Ret = UTOPIA_STATUS_FAIL;
11986                                 }
11987                             }else
11988                             {
11989                                 XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE,"Create Path Error !!\n");
11990                                 u32Ret = UTOPIA_STATUS_FAIL;
11991                             }
11992                         }
11993                         else
11994                         {
11995                             XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE,"Delete Path Error !!\n");
11996                         }
11997 
11998 
11999                     }
12000                 }
12001                 MApi_XC_DisableInputSource_U2(pInstance,DISABLE, MAIN_WINDOW);
12002 
12003                 //if(pXCResourceStr->bPIP_enable)
12004                 //{
12005                 //    MApi_XC_DisableInputSource_U2(pInstance,DISABLE, SUB_WINDOW);
12006                 //}
12007                 if (  ((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM])==0)
12008                     &&((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM])==0))
12009                 {
12010                     // setwindow will be done when str resume.
12011                     pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12012                 }
12013                 if(pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr)
12014                 {
12015                     pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12016                     // wait xc front module resume done
12017                     if(IsSrcTypeYPbPr(gSrcInfo[MAIN_WINDOW].enInputSourceType) ||IsSrcTypeVga(gSrcInfo[MAIN_WINDOW].enInputSourceType)
12018                         ||IsSrcTypeHDMI(gSrcInfo[MAIN_WINDOW].enInputSourceType))
12019                     {
12020                         //get signal status
12021                         XC_IP_SYNC_STATUS  sXC_Sync_Status = {0};
12022                         MS_U16 u16DelayTime = 0;
12023                         MS_U16 u16DelayTimeTemp = 0;
12024                         MS_U16 u16PreVototal = 0,u16PreHperiod = 0;
12025 
12026                         MDrv_XC_GetSyncStatus(pInstance,gSrcInfo[MAIN_WINDOW].enInputSourceType,&sXC_Sync_Status,MAIN_WINDOW);
12027                         u16DelayTime = (DELAY_FRAME_NUM)*(1000/(gSrcInfo[MAIN_WINDOW].u16InputVFreq/10));
12028 
12029                         while(((sXC_Sync_Status.u8SyncStatus & XC_MD_HSYNC_LOSS_BIT)||(sXC_Sync_Status.u8SyncStatus & XC_MD_VSYNC_LOSS_BIT))
12030                                     &&(u16DelayTimeTemp < u16DelayTime))
12031                         {
12032                             MsOS_DelayTask(1);
12033                             u16DelayTimeTemp++;
12034                             MDrv_XC_GetSyncStatus(pInstance,gSrcInfo[MAIN_WINDOW].enInputSourceType,&sXC_Sync_Status,MAIN_WINDOW);
12035                         }
12036 
12037                         if(u16DelayTimeTemp > u16DelayTime)
12038                         {
12039                                 printf("[%s,%d] Signal detect  Time Out!\n",__FUNCTION__,__LINE__);
12040                                 pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12041                         }
12042                         else
12043                         {
12044                             u16PreVototal = pXCResourcePrivate->stdrvXC_IP.sPCMONITOR_status[MAIN_WINDOW].u16Vtotal;
12045                             u16PreHperiod = pXCResourcePrivate->stdrvXC_IP.sPCMONITOR_status[MAIN_WINDOW].u16Hperiod;
12046 
12047                             if(_MApi_XC_PCMonitor_Exe(pInstance,MAIN_WINDOW, gSrcInfo[MAIN_WINDOW].enInputSourceType) == E_XC_PCMONITOR_STABLE_SYNC)
12048                             {
12049                                 if((abs(u16PreVototal -pXCResourcePrivate->stdrvXC_IP.sPCMONITOR_status[MAIN_WINDOW].u16Vtotal)>MD_VTOTAL_TORLANCE)
12050                                   ||((abs(u16PreHperiod -pXCResourcePrivate->stdrvXC_IP.sPCMONITOR_status[MAIN_WINDOW].u16Hperiod)>MD_HPERIOD_TORLANCE)))
12051                                 {
12052                                     printf("[%s,%d] Timing has changed!\n",__FUNCTION__,__LINE__);
12053                                     pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12054                                     pXCResourcePrivate->stdrvXC_MVideo.bTimingUnstableForStr = TRUE;
12055                                 }
12056                                 else
12057                                 {
12058                                     pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = TRUE;
12059                                 }
12060                             }
12061                             else
12062                             {
12063                                 pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12064                                 pXCResourcePrivate->stdrvXC_MVideo.bTimingUnstableForStr = TRUE;
12065                             }
12066                         }
12067                     }
12068                     else if(IsSrcTypeAV(gSrcInfo[MAIN_WINDOW].enInputSourceType)||IsSrcTypeATV(gSrcInfo[MAIN_WINDOW].enInputSourceType)||IsSrcTypeDTV(gSrcInfo[MAIN_WINDOW].enInputSourceType))
12069                     {
12070                         UtopiaStrWaitCondition("xc", enPowerState, 0);
12071                         pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = TRUE;
12072                         if(IsSrcTypeAV(gSrcInfo[MAIN_WINDOW].enInputSourceType))
12073                         {
12074                             const char Vd_Key[] = "timing change";
12075                             char Value[255];
12076                             if(UTOPIA_STATUS_SUCCESS == (UtopiaStrGetData(&Vd_Key,&Value)))
12077                             {
12078                                 if(0 == strcmp(Value,"yes" ))
12079                                 {
12080                                     printf("[%s,%d] Timing has changed!\n",__FUNCTION__,__LINE__);
12081                                     pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr = FALSE;
12082                                 }
12083                             }
12084                         }
12085                     }
12086 
12087                     if(pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr)
12088                     {
12089                         /*2.set_window,*/
12090                         if(MApi_XC_SetWindow_U2(pInstance,&(pXCResourceStr->pstXC_SetWin_Info[MAIN_WINDOW]), sizeof(XC_SETWIN_INFO), MAIN_WINDOW) ==FALSE)
12091                         {
12092                             u32Ret = UTOPIA_STATUS_FAIL;
12093                         }
12094                         /*3.set_paneltiming,*/
12095                         MApi_XC_SetPanelTiming_U2(pInstance,&(pXCResourceStr->pTimingInfo), MAIN_WINDOW);
12096                         /*4.load_pq,*/
12097 #ifndef DISABLE_PQ_FUNCTION
12098                         MDrv_PQ_LoadSettings(PQ_MAIN_WINDOW);
12099 
12100                         /*4.pq delay,*/
12101                         MS_U16 u16PQdelay = 0;
12102                         u16PQdelay=MDrv_PQ_GetDelayTime(PQ_MAIN_WINDOW);
12103                         MsOS_DelayTask(u16PQdelay);
12104 #endif
12105                     }
12106                 }
12107 
12108                 //if(pXCResourceStr->bPIP_enable)
12109                 //{
12110                 //    if(MApi_XC_SetWindow_U2(pInstance,&(pXCResourceStr->pstXC_SetWin_Info[SUB_WINDOW]), sizeof(XC_SETWIN_INFO), SUB_WINDOW) ==FALSE)
12111                 //    {
12112                 //        u32Ret = UTOPIA_STATUS_FAIL;
12113                 //    }
12114                 //}
12115                 if(currentSrc[MAIN_WINDOW] == INPUT_SOURCE_VGA)
12116                     {
12117                     MApi_XC_ADC_AdjustGainOffset_U2(pInstance, &(pXCResourceStr->stADCSetting));
12118                 }
12119 
12120                 /// For CVBS out, recover ADC table
12121                 if(pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr)
12122                 {
12123                     if(IsSrcTypeATV(gSrcInfo[MAIN_WINDOW].enInputSourceType) || IsSrcTypeDTV(gSrcInfo[MAIN_WINDOW].enInputSourceType) || IsSrcTypeSV(gSrcInfo[MAIN_WINDOW].enInputSourceType))
12124                     {
12125                         MApi_XC_ADC_SetCVBSOut_U2(pInstance, TRUE, OUTPUT_CVBS1 , gSrcInfo[MAIN_WINDOW].enInputSourceType, TRUE);
12126                     }
12127                 }
12128 
12129                 _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12130             }
12131 #endif
12132             u32Ret = UTOPIA_STATUS_SUCCESS;
12133             //enable mload lastly for saving  time when power resume
12134             //when you need to add code,put them ahead of here
12135             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_u32MLoadBufByteLen_Suspend > 0)
12136             {
12137                 _MLOAD_ENTRY(pInstance);
12138                 MDrv_XC_MLoad_Enable(pInstance,  TRUE);
12139                 _MLOAD_RETURN(pInstance);
12140             }
12141 
12142 #ifdef MSOS_TYPE_LINUX_KERNEL
12143             for(i = 0; i < MAX_WINDOW; i++)
12144             {
12145                 if(pXCResourcePrivate->stdrvXC_MVideo.bSignalStableForStr)
12146                 {
12147                 MDrv_SC_GenerateBlackVideo(pInstance, gSrcInfo[i].bBlackscreenEnabled, (SCALER_WIN)i);
12148             }
12149 
12150             }
12151 #endif
12152 
12153         }
12154         else
12155         {
12156             printf("[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
12157             u32Ret = UTOPIA_STATUS_FAIL;
12158         }
12159         pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState = enPowerState;
12160     }
12161     else
12162     {
12163         printf("[%s,%5d]Do Nothing: %u\n",__FUNCTION__,__LINE__,enPowerState);
12164         u32Ret = UTOPIA_STATUS_FAIL;
12165     }
12166     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12167 #if LOGTIMECOST
12168     printf("=========[%s,%5d] cost %lu ms========\n", __FUNCTION__, __LINE__, MsOS_GetSystemTime() - u32Begin);
12169 #endif
12170 
12171     return u32Ret;
12172 
12173 #else  ////For Optee STR
12174     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12175 
12176 
12177     if (enPowerState == E_POWER_SUSPEND)
12178     {
12179         ///Do nothing for optee suspend
12180     }
12181     else if (enPowerState == E_POWER_RESUME)
12182     {
12183         if(pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == TRUE)
12184         {
12185             if((E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
12186 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
12187               ||(E_XC_DEVICE1 == psXCInstPri->u32DeviceID)
12188 #endif
12189               )
12190             {
12191 #if 0 //which will be locked by seal side
12192                 Hal_SC_secure_lock(pInstance, MAIN_WINDOW, TRUE, TRUE);
12193 #endif
12194                 /// recorver for FB adress REG
12195 
12196                 MDrv_XC_OPTEE_Control(pInstance,E_XC_OPTEE_UPDATE_HANDLER,&pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW]);
12197             }
12198         }
12199         else if(pXCResourcePrivate->sthal_Optee.op_tee_xc[SUB_WINDOW].isEnable == TRUE)
12200         {
12201 #if 0 //which will be locked by seal side
12202             Hal_SC_secure_lock(pInstance, SUB_WINDOW, TRUE, TRUE);
12203 #endif
12204             MDrv_XC_OPTEE_Control(pInstance,E_XC_OPTEE_UPDATE_HANDLER,&pXCResourcePrivate->sthal_Optee.op_tee_xc[SUB_WINDOW]);
12205         }
12206     }
12207 
12208     return UTOPIA_STATUS_SUCCESS;
12209 
12210 #endif
12211 }
12212 
MApi_XC_SetPowerState(EN_POWER_MODE enPowerState)12213 MS_U32 MApi_XC_SetPowerState(EN_POWER_MODE enPowerState)
12214 {
12215     if (pu32XCInst == NULL)
12216     {
12217         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12218         return UTOPIA_STATUS_FAIL;
12219     }
12220 
12221     stXC_SET_POWERSTATE XCArgs;
12222     XCArgs.enPowerState = enPowerState;
12223     XCArgs.u32ReturnValue = UTOPIA_STATUS_FAIL;
12224 
12225     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_POWERSTATE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12226     {
12227         printf("Obtain XC engine fail\n");
12228         return UTOPIA_STATUS_FAIL;
12229     }
12230 
12231 #if (MAX_XC_DEVICE_NUM == 2) // Support SC1
12232     if (pu32XCInst_1 == NULL)
12233     {
12234         printf("[%s,%5d] No SC1 instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12235         return UTOPIA_STATUS_FAIL;
12236     }
12237 
12238     XCArgs.enPowerState = enPowerState;
12239     XCArgs.u32ReturnValue = UTOPIA_STATUS_FAIL;
12240 
12241     if(UtopiaIoctl(pu32XCInst_1, E_XC_CMD_SET_POWERSTATE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12242     {
12243         printf("Obtain XC engine fail\n");
12244         return UTOPIA_STATUS_FAIL;
12245     }
12246 #endif
12247 
12248     return XCArgs.u32ReturnValue;
12249 }
12250 
12251 
12252 //-------------------------------------------------------------------------------------------------
12253 /// MApi_XC_SetByPassOSDVsyncPos
12254 /// @param  u16VsyncStart                              \b IN: OSD vsync start
12255 /// @param  u16VsyncEnd                                \b IN: OSD vsync end
12256 //-------------------------------------------------------------------------------------------------
MApi_XC_BYPASS_SetOSDVsyncPos_U2(void * pInstance,MS_U16 u16VsyncStart,MS_U16 u16VsyncEnd)12257 void MApi_XC_BYPASS_SetOSDVsyncPos_U2(void* pInstance, MS_U16 u16VsyncStart, MS_U16 u16VsyncEnd)
12258 {
12259     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
12260 
12261     _XC_ENTRY(pInstance);
12262 
12263     MHal_XC_ByPass_SetOSDVsyncPos(pInstance, u16VsyncStart, u16VsyncEnd);
12264 
12265     _XC_RETURN(pInstance);
12266     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
12267 
12268 }
12269 
MApi_XC_BYPASS_SetOSDVsyncPos(MS_U16 u16VsyncStart,MS_U16 u16VsyncEnd)12270 void MApi_XC_BYPASS_SetOSDVsyncPos(MS_U16 u16VsyncStart, MS_U16 u16VsyncEnd)
12271 {
12272     if (pu32XCInst == NULL)
12273     {
12274         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12275         return;
12276     }
12277 
12278     stXC_SET_BYPASS_OSDVSYNC_POS XCArgs;
12279     XCArgs.u16VsyncStart = u16VsyncStart;
12280     XCArgs.u16VsyncEnd = u16VsyncEnd;
12281 
12282     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BYPASS_OSDVSYNC_POS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12283     {
12284         printf("Obtain XC engine fail\n");
12285         return;
12286     }
12287     else
12288     {
12289         return;
12290     }
12291 }
12292 
12293 //-------------------------------------------------------------------------------------------------
12294 /// MApi_XC_BYPASS_SetInputSrc
12295 /// @param  bEnable                              \b IN: ENABLE/DISABLE bypass mode
12296 /// @param  input                                \b IN: Select the input source for bypass mode
12297 //-------------------------------------------------------------------------------------------------
MApi_XC_BYPASS_SetInputSrc_U2(void * pInstance,MS_BOOL bEnable,E_XC_BYPASS_InputSource input)12298 void MApi_XC_BYPASS_SetInputSrc_U2(void* pInstance, MS_BOOL bEnable, E_XC_BYPASS_InputSource input)
12299 {
12300     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
12301 
12302     MHal_XC_BYPASS_Setinputclk(pInstance, bEnable,input);
12303 
12304     _XC_ENTRY(pInstance);
12305     MHal_XC_Bypass_SetinputSrc(pInstance, input);
12306     _XC_RETURN(pInstance);
12307     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
12308 }
12309 
MApi_XC_BYPASS_SetInputSrc(MS_BOOL bEnable,E_XC_BYPASS_InputSource input)12310 void MApi_XC_BYPASS_SetInputSrc(MS_BOOL bEnable, E_XC_BYPASS_InputSource input)
12311 {
12312     if (pu32XCInst == NULL)
12313     {
12314         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12315         return;
12316     }
12317 
12318     stXC_SET_BYPASS_INPUTSRC XCArgs;
12319     XCArgs.bEnable = bEnable;
12320     XCArgs.input = input;
12321 
12322     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BYPASS_INPUTSRC, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12323     {
12324         printf("Obtain XC engine fail\n");
12325         return;
12326     }
12327     else
12328     {
12329         return;
12330     }
12331 }
12332 
12333 //-------------------------------------------------------------------------------------------------
12334 /// MApi_XC_SetSeamlessZapping
12335 /// @param  eWindow                 \b IN: which window we are going to enable or disable
12336 /// @param  bEnable                 \b IN: ENABLE/DISABLE seamless zapping
12337 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL
12338 //-------------------------------------------------------------------------------------------------
MApi_XC_SetSeamlessZapping_U2(void * pInstance,SCALER_WIN eWindow,MS_BOOL bEnable)12339 E_APIXC_ReturnValue MApi_XC_SetSeamlessZapping_U2(void* pInstance, SCALER_WIN eWindow, MS_BOOL bEnable)
12340 {
12341     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
12342     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
12343 
12344     if(!SUPPORT_SEAMLESS_ZAPPING)
12345     {
12346         XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
12347         return E_APIXC_RET_FAIL;
12348     }
12349     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12350     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12351     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12352     if(!MDrv_XC_GetDynamicScalingStatus(pInstance))
12353     {
12354         if(!bEnable)
12355         {
12356             eRet = E_APIXC_RET_OK;
12357         }
12358         else
12359         {
12360             XC_LOG_TRACE(XC_DBGLEVEL_SEAMLESSZAP, "[%s][%06d] Dynamic scaling is not initialized\n", __FUNCTION__, __LINE__);
12361             eRet = E_APIXC_RET_FAIL;
12362         }
12363     }
12364     else
12365     {
12366         _XC_ENTRY(pInstance);
12367         if(bEnable)
12368         {
12369             MDrv_XC_Set_DSIndexSourceSelect(pInstance, E_XC_DS_INDEX_SCALER, eWindow);
12370         }
12371         else
12372         {
12373             MDrv_XC_Set_DSIndexSourceSelect(pInstance, E_XC_DS_INDEX_MVOP, eWindow);
12374         }
12375 
12376         eRet = Hal_SC_SetSeamlessZapping(pInstance, eWindow, bEnable);
12377         XC_LOG_TRACE(XC_DBGLEVEL_SEAMLESSZAP, "[%s][%06d] set Seamless Zapping[%s] = %x\n", __FUNCTION__, __LINE__, eWindow?"SUB":"MAIN", bEnable);
12378 
12379         _XC_RETURN(pInstance);
12380     }
12381     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12382     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
12383     return eRet;
12384 }
12385 
MApi_XC_SetSeamlessZapping(SCALER_WIN eWindow,MS_BOOL bEnable)12386 E_APIXC_ReturnValue MApi_XC_SetSeamlessZapping(SCALER_WIN eWindow, MS_BOOL bEnable)
12387 {
12388     if (pu32XCInst == NULL)
12389     {
12390         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12391         return E_APIXC_RET_FAIL;
12392     }
12393 
12394     stXC_SET_SEAMLESS_ZAPPING XCArgs;
12395     XCArgs.eWindow = eWindow;
12396     XCArgs.bEnable = bEnable;
12397     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12398 
12399     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_SEAMLESS_ZAPPING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12400     {
12401         printf("Obtain XC engine fail\n");
12402         return E_APIXC_RET_FAIL;
12403     }
12404     else
12405     {
12406         return XCArgs.eReturnValue;
12407     }
12408 }
12409 
12410 
MApi_XC_GetSeamlessZappingStatus_U2(void * pInstance,SCALER_WIN eWindow,MS_BOOL * pbEnable)12411 E_APIXC_ReturnValue MApi_XC_GetSeamlessZappingStatus_U2(void* pInstance, SCALER_WIN eWindow, MS_BOOL* pbEnable)
12412 {
12413     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
12414 
12415     E_APIXC_ReturnValue eReturnValue = E_APIXC_RET_FAIL;
12416 
12417     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12418     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12419     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12420     *pbEnable = Hal_SC_GetSeamlessZappingStatus(pInstance, eWindow);
12421     XC_LOG_TRACE(XC_DBGLEVEL_SEAMLESSZAP, "[%s][%06d] get Seamless Zapping[%s] = %x\n", __FUNCTION__, __LINE__, eWindow?"SUB":"MAIN", *pbEnable);
12422     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12423 
12424     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
12425 
12426     eReturnValue = E_APIXC_RET_OK;
12427 
12428     return eReturnValue;
12429 }
12430 
MApi_XC_GetSeamlessZappingStatus(SCALER_WIN eWindow,MS_BOOL * pbEnable)12431 E_APIXC_ReturnValue MApi_XC_GetSeamlessZappingStatus(SCALER_WIN eWindow, MS_BOOL* pbEnable)
12432 {
12433     if (pu32XCInst == NULL)
12434     {
12435         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12436         return E_APIXC_RET_FAIL;
12437     }
12438 
12439     stXC_GET_SEAMLESS_ZAPPING_STATUS XCArgs;
12440     XCArgs.eWindow = eWindow;
12441     XCArgs.pbEnable = pbEnable;
12442     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12443 
12444     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_SEAMLESS_ZAPPING_STATUS, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12445     {
12446         printf("Obtain XC engine fail\n");
12447         return E_APIXC_RET_FAIL;
12448     }
12449     else
12450     {
12451         return XCArgs.eReturnValue;
12452     }
12453 }
12454 
12455 //-------------------------------------------------------------------------------------------------
12456 /// MApi_XC_Vtrack_SetPayloadData
12457 /// @param  u16Timecode                       \b IN: The time code is coded on 16 bits. It is calculated based on the number of days from January 1st.
12458 /// @param  u8ID                              \b IN: Operator ID
12459 //-------------------------------------------------------------------------------------------------
MApi_XC_Vtrack_SetPayloadData_U2(void * pInstance,MS_U16 u16Timecode,MS_U8 u8OperatorID)12460 E_APIXC_ReturnValue MApi_XC_Vtrack_SetPayloadData_U2(void* pInstance, MS_U16 u16Timecode, MS_U8 u8OperatorID)
12461 {
12462     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
12463     _MLOAD_ENTRY(pInstance);
12464     eReturn = MHal_XC_Vtrack_SetPayloadData(pInstance, u16Timecode, u8OperatorID);
12465     _MLOAD_RETURN(pInstance);
12466     return eReturn;
12467 }
12468 
MApi_XC_Vtrack_SetPayloadData(MS_U16 u16Timecode,MS_U8 u8OperatorID)12469 E_APIXC_ReturnValue MApi_XC_Vtrack_SetPayloadData(MS_U16 u16Timecode, MS_U8 u8OperatorID)
12470 {
12471     if (pu32XCInst == NULL)
12472     {
12473         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12474         return E_APIXC_RET_FAIL;
12475     }
12476 
12477     stXC_SET_VTRACK_PAYLOADDATA XCArgs;
12478     XCArgs.u16Timecode = u16Timecode;
12479     XCArgs.u8OperatorID = u8OperatorID;
12480     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12481 
12482     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VTRACK_PAYLOADDATA, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12483     {
12484         printf("Obtain XC engine fail\n");
12485         return E_APIXC_RET_FAIL;
12486     }
12487     else
12488     {
12489         return XCArgs.eReturnValue;
12490     }
12491 }
12492 
12493 //-------------------------------------------------------------------------------------------------
12494 /// MApi_XC_Vtrack_SetUserDefindedSetting
12495 /// @param  bEnable                              \b IN: ENABLE/DISABLE Customized Setting
12496 /// @param  pu8Setting                           \b IN: pointer to targert user definded setting data (include setting1 to setting3)
12497 //-------------------------------------------------------------------------------------------------
MApi_XC_Vtrack_SetUserDefindedSetting_U2(void * pInstance,MS_BOOL bUserDefinded,MS_U8 * pu8Setting)12498 E_APIXC_ReturnValue MApi_XC_Vtrack_SetUserDefindedSetting_U2(void *pInstance, MS_BOOL bUserDefinded, MS_U8 *pu8Setting)
12499 {
12500     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
12501     _MLOAD_ENTRY(pInstance);
12502     eReturn = MHal_XC_Vtrack_SetUserDefindedSetting(pInstance, bUserDefinded, pu8Setting);
12503     _MLOAD_RETURN(pInstance);
12504     return eReturn;
12505 }
12506 
MApi_XC_Vtrack_SetUserDefindedSetting(MS_BOOL bUserDefinded,MS_U8 * pu8Setting)12507 E_APIXC_ReturnValue MApi_XC_Vtrack_SetUserDefindedSetting(MS_BOOL bUserDefinded, MS_U8 *pu8Setting)
12508 {
12509     if (pu32XCInst == NULL)
12510     {
12511         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12512         return E_APIXC_RET_FAIL;
12513     }
12514 
12515     stXC_SET_VTRACK_USERDEFINED_SETTING XCArgs;
12516     XCArgs.bUserDefinded = bUserDefinded;
12517     XCArgs.pu8Setting = pu8Setting;
12518     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12519 
12520     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VTRACK_USERDEFINED_SETTING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12521     {
12522         printf("Obtain XC engine fail\n");
12523         return E_APIXC_RET_FAIL;
12524     }
12525     else
12526     {
12527         return XCArgs.eReturnValue;
12528     }
12529 }
12530 
12531 //-------------------------------------------------------------------------------------------------
12532 /// MApi_XC_Vtrack_Enable
12533 /// @param  u8FrameRate                          \b IN: ENABLE/DISABLE The FrameRateIn is based on the output format of the box
12534 /// @param  bEnable                              \b IN: ENABLE/DISABLE Vtrack
12535 //-------------------------------------------------------------------------------------------------
MApi_XC_Vtrack_Enable_U2(void * pInstance,MS_U8 u8FrameRate,MS_BOOL bEnable)12536 E_APIXC_ReturnValue MApi_XC_Vtrack_Enable_U2(void* pInstance, MS_U8 u8FrameRate, MS_BOOL bEnable)
12537 {
12538     E_APIXC_ReturnValue eReturn = E_APIXC_RET_FAIL;
12539     _MLOAD_ENTRY(pInstance);
12540     eReturn = MHal_XC_Vtrack_Enable(pInstance, u8FrameRate, bEnable);
12541     _MLOAD_RETURN(pInstance);
12542     return eReturn;
12543 }
12544 
MApi_XC_Vtrack_Enable(MS_U8 u8FrameRate,MS_BOOL bEnable)12545 E_APIXC_ReturnValue MApi_XC_Vtrack_Enable(MS_U8 u8FrameRate, MS_BOOL bEnable)
12546 {
12547     if (pu32XCInst == NULL)
12548     {
12549         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12550         return E_APIXC_RET_FAIL;
12551     }
12552 
12553     stXC_SET_VTRACK_ENABLE XCArgs;
12554     XCArgs.u8FrameRate = u8FrameRate;
12555     XCArgs.bEnable = bEnable;
12556     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12557 
12558     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_VTRACK_ENABLE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12559     {
12560         printf("Obtain XC engine fail\n");
12561         return E_APIXC_RET_FAIL;
12562     }
12563     else
12564     {
12565         return XCArgs.eReturnValue;
12566     }
12567 }
12568 
12569 //-------------------------------------------------------------------------------------------------
12570 /// Pre-set the specific window with PQ info
12571 /// @param  pstXC_SetWin_Info      \b IN: the information of the window setting
12572 /// @param  eWindow                \b IN: which window we are going to set
12573 //-------------------------------------------------------------------------------------------------
MApi_XC_PreSetPQInfo_U2(void * pInstance,XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)12574 void MApi_XC_PreSetPQInfo_U2(void* pInstance, XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
12575 {
12576     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12577     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12578     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12579     MS_U32 u32DisPOddCheck = 0x00;
12580     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12581     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12582     MDrv_SC_SetPQHSDFlag(pInstance, FALSE); //Reset variable
12583 
12584     if(pstXC_SetWin_Info->bInterlace)
12585     {
12586         //The component 1080i can't frame lock when capture start is odd.
12587 #ifdef K3_U2
12588         if(!IsSrcTypeDTV( pstXC_SetWin_Info->enInputSourceType ))
12589 #endif
12590         {
12591             // the Capture start should be even
12592             if(pstXC_SetWin_Info->stCapWin.y%2)
12593             {
12594                 pstXC_SetWin_Info->stCapWin.y += 1;
12595                 pstXC_SetWin_Info->stCapWin.height -= 1; //Y+1, so height-1 to keep not capture outside
12596             }
12597         }
12598 
12599         // the Capture height should be even
12600         if(pstXC_SetWin_Info->stCapWin.height%2)
12601         {
12602             pstXC_SetWin_Info->stCapWin.height -= 1;
12603         }
12604     }
12605 
12606     // copy user data to internal data
12607     // here is a patch first, will remove after seperate Internal XC status with set window information
12608     //u32CopyLen = sizeof(XC_SETWIN_INFO) - (sizeof(MS_BOOL)*2) - (sizeof(MS_U16)*4);
12609     //memcpy(&gSrcInfo[eWindow], pstXC_SetWin_Info, u32CopyLen);
12610     //do not use memcopy(), strongly depend on structure definition
12611     _Mdrv_XC_CopySetWinInfo(pInstance, pstXC_SetWin_Info, eWindow);
12612 
12613     // The total pixel conut of display window can not be odd.
12614     u32DisPOddCheck = gSrcInfo[eWindow].stDispWin.width * gSrcInfo[eWindow].stDispWin.height;
12615     // if u32DisPOddCheck is odd, that means both of disp.width and disp.height is odd.
12616     // we adjust width to even.
12617     if (u32DisPOddCheck & 0x01)
12618     {
12619         if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > gSrcInfo[eWindow].stDispWin.width )
12620         {
12621             gSrcInfo[eWindow].stDispWin.width = ( gSrcInfo[eWindow].stDispWin.width + 1 ) & ~0x1;
12622         }
12623     }
12624 
12625     // if mirror, need to re-cal display window but Ninelattice!!
12626     if(IsVMirrorMode(eWindow) &&(!gSrcInfo[eWindow].bDisplayNineLattice))
12627     {
12628         MS_U32 u32TempWidth = gSrcInfo[eWindow].stDispWin.width;
12629         MS_U32 u32TempHeight = gSrcInfo[eWindow].stDispWin.height;
12630 
12631         if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth ) )
12632         {
12633             gSrcInfo[eWindow].stDispWin.x =
12634                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width - ( gSrcInfo[eWindow].stDispWin.x + u32TempWidth );
12635         }
12636         else
12637         {
12638             gSrcInfo[eWindow].stDispWin.x = 0;
12639         }
12640 
12641 
12642         if( pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight ) )
12643         {
12644             gSrcInfo[eWindow].stDispWin.y =
12645                 pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height - ( gSrcInfo[eWindow].stDispWin.y + u32TempHeight );
12646         }
12647         else
12648         {
12649             gSrcInfo[eWindow].stDispWin.y = 0;
12650         }
12651     }
12652 #ifndef DISABLE_3D_FUNCTION
12653     MDrv_SC_3D_FormatValidation(pInstance, &gSrcInfo[eWindow], eWindow);
12654     MDrv_SC_3D_AdjustHShift(pInstance, &gSrcInfo[eWindow], eWindow);
12655 #endif
12656     gSrcInfo[eWindow].stDispWin.x += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart;
12657     gSrcInfo[eWindow].stDispWin.y += pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
12658 
12659     // dump debug msg
12660     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"============= SetWindow Start (Window : %u, src: %u) =============\n",eWindow, gSrcInfo[eWindow].enInputSourceType);
12661     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CapWin  x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCapWin.x, gSrcInfo[eWindow].stCapWin.y, gSrcInfo[eWindow].stCapWin.width, gSrcInfo[eWindow].stCapWin.height);
12662     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"CropWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stCropWin.x, gSrcInfo[eWindow].stCropWin.y, gSrcInfo[eWindow].stCropWin.width, gSrcInfo[eWindow].stCropWin.height);
12663     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"DispWin x: %4u  y: %4u  w: %4u  h: %4u \n",gSrcInfo[eWindow].stDispWin.x,gSrcInfo[eWindow].stDispWin.y, gSrcInfo[eWindow].stDispWin.width, gSrcInfo[eWindow].stDispWin.height);
12664     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Panel   x: %4u  y: %4u  w: %4u  h: %4u \n", pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart
12665                                                                                   , pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart
12666                                                                                   , pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width
12667                                                                                   , pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height);
12668     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Mirror/Interlace/Hdup = %u/%u/%u\n", IsVMirrorMode(eWindow), pstXC_SetWin_Info->bInterlace, pstXC_SetWin_Info->bHDuplicate);
12669     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"H/V total = (%u, %u), VFreq = %u\n", pstXC_SetWin_Info->u16DefaultHtotal, pstXC_SetWin_Info->u16InputVTotal, pstXC_SetWin_Info->u16InputVFreq);
12670     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Pre  H cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].Status2.bPreHCusScaling, gSrcInfo[eWindow].Status2.u16PreHCusScalingSrc, gSrcInfo[eWindow].Status2.u16PreHCusScalingDst);
12671     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Pre  V cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].Status2.bPreVCusScaling, gSrcInfo[eWindow].Status2.u16PreVCusScalingSrc, gSrcInfo[eWindow].Status2.u16PreVCusScalingDst);
12672     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Post H cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].bHCusScaling, gSrcInfo[eWindow].u16HCusScalingSrc, gSrcInfo[eWindow].u16HCusScalingDst);
12673     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"Post V cus scaling %u (%u -> %u)\n", gSrcInfo[eWindow].bVCusScaling, gSrcInfo[eWindow].u16VCusScalingSrc, gSrcInfo[eWindow].u16VCusScalingDst);
12674     memcpy(&gSrcInfo[eWindow].stStatusnodelay.stDispWin, &gSrcInfo[eWindow].stDispWin, sizeof(MS_WINDOW_TYPE));
12675     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12676     // Scaler must update source before width / height checking.
12677     _MDrv_XC_Set_PQ_SourceData(pInstance, eWindow, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow]);
12678     msAPI_Scaler_SetMode(pInstance, gSrcInfo[eWindow].enInputSourceType, &gSrcInfo[eWindow], eWindow);
12679 
12680 }
12681 
MApi_XC_PreSetPQInfo(XC_SETWIN_INFO * pstXC_SetWin_Info,SCALER_WIN eWindow)12682 void MApi_XC_PreSetPQInfo(XC_SETWIN_INFO *pstXC_SetWin_Info, SCALER_WIN eWindow)
12683 {
12684     if (pu32XCInst == NULL)
12685     {
12686         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12687         return;
12688     }
12689 
12690     stXC_PRESET_PQINFO XCArgs;
12691     XCArgs.pstXC_SetWin_Info = pstXC_SetWin_Info;
12692     XCArgs.eWindow = eWindow;
12693 
12694     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_PRESET_PQINFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12695     {
12696         printf("Obtain XC engine fail\n");
12697         return;
12698     }
12699     else
12700     {
12701         return;
12702     }
12703 }
12704 
12705 //-------------------------------------------------------------------------------------------------
12706 /// Mapi_XC_Is_OP1_TestPattern_Enabled
12707 /// @return MS_BOOL: TRUE - enabled, FALSED - disabled
12708 //-------------------------------------------------------------------------------------------------
MApi_XC_Is_OP1_TestPattern_Enabled_U2(void * pInstance)12709 MS_BOOL MApi_XC_Is_OP1_TestPattern_Enabled_U2(void* pInstance)
12710 {
12711 #ifndef DISABLE_HW_PATTERN_FUNCTION
12712     #ifdef SUPPORT_HW_TESTPATTERN
12713         XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12714         UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12715         XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12716         MS_BOOL bReturn = FALSE;
12717         _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12718         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12719         bReturn = pXCResourcePrivate->stdrvXC_MVideo.bIsHWPatternEnabled;
12720         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12721         return bReturn;
12722     #else
12723         return FALSE;
12724     #endif
12725 #else
12726     return FALSE;
12727 #endif
12728 }
12729 
MApi_XC_Is_OP1_TestPattern_Enabled(void)12730 MS_BOOL MApi_XC_Is_OP1_TestPattern_Enabled(void)
12731 {
12732     if (pu32XCInst == NULL)
12733     {
12734         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12735         return FALSE;
12736     }
12737 
12738     stXC_GET_OP1_TESTPATTERN_ENABLED XCArgs;
12739     XCArgs.bReturnValue = FALSE;
12740 
12741     if(UtopiaIoctl(pu32XCInst, E_XC_GET_OP1_TESTPATTERN_ENABLED, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12742     {
12743         printf("Obtain XC engine fail\n");
12744         return FALSE;
12745     }
12746     else
12747     {
12748         return XCArgs.bReturnValue;
12749     }
12750 }
12751 
12752 //-------------------------------------------------------------------------------------------------
12753 /// MApi_XC_Set_OP1_TestPattern
12754 /// @param  ePattern                                      \b IN: select test pattern
12755 /// @param  eMode                                         \b IN: choose the patgen mode
12756 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL or E_APIXC_RET_FAIL_FUN_NOT_SUPPORT
12757 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_OP1_TestPattern_U2(void * pInstance,EN_XC_OP1_PATTERN ePattern,EN_XC_OP1_PATGEN_MODE eMode)12758 E_APIXC_ReturnValue MApi_XC_Set_OP1_TestPattern_U2(void* pInstance, EN_XC_OP1_PATTERN ePattern, EN_XC_OP1_PATGEN_MODE eMode)
12759 {
12760     E_APIXC_ReturnValue enResult = E_APIXC_RET_OK;
12761 
12762 #ifndef DISABLE_HW_PATTERN_FUNCTION
12763 
12764 #ifdef SUPPORT_HW_TESTPATTERN
12765     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12766     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12767     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12768     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12769     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12770     _XC_ENTRY(pInstance);
12771     if (FALSE == pXCResourcePrivate->stdrvXC_MVideo.bIsHWPatternEnabled)
12772     {
12773         pXCResourcePrivate->stdrvXC_MVideo.bIsInputSrcDisabled = Hal_SC_Is_InputSource_Disable(pInstance, MAIN_WINDOW) >> 7;
12774         pXCResourcePrivate->stdrvXC_MVideo.bIsMute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1)) >> 1;
12775 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
12776         if (IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type))
12777         {
12778             pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCMute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1)) >> 1;
12779         }
12780 #endif
12781     }
12782 
12783     if (E_XC_OP1_PATTERN_OFF == ePattern)
12784     {
12785         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1),BIT(1)); //window color en : on
12786 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
12787         if (IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type))
12788         {
12789             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1),BIT(1));
12790         }
12791 #endif
12792 
12793         MDrv_SC_OP1_PatGen_Disable(pInstance);
12794 
12795         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, (pXCResourcePrivate->stdrvXC_MVideo.bIsMute << 1),BIT(1));
12796   #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
12797         if (IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type))
12798         {
12799             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCMute << 1),BIT(1));
12800         }
12801 #endif
12802         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, (pXCResourcePrivate->stdrvXC_MVideo.bIsInputSrcDisabled << 7),BIT(7));
12803 
12804         pXCResourcePrivate->stdrvXC_MVideo.bIsHWPatternEnabled = FALSE;
12805     }
12806     else
12807     {
12808         MDrv_SC_Set_OP1_TestPattern(pInstance, ePattern, eMode);
12809         pXCResourcePrivate->stdrvXC_MVideo.bIsHWPatternEnabled = TRUE;
12810     }
12811     _XC_RETURN(pInstance);
12812     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12813 #else
12814     enResult = E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
12815 #endif
12816 
12817 #else
12818     enResult = E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
12819 #endif
12820 
12821 
12822     return enResult;
12823 }
12824 
MApi_XC_Set_OP1_TestPattern(EN_XC_OP1_PATTERN ePattern,EN_XC_OP1_PATGEN_MODE eMode)12825 E_APIXC_ReturnValue MApi_XC_Set_OP1_TestPattern(EN_XC_OP1_PATTERN ePattern, EN_XC_OP1_PATGEN_MODE eMode)
12826 {
12827     if (pu32XCInst == NULL)
12828     {
12829         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12830         return E_APIXC_RET_FAIL;
12831     }
12832 
12833     stXC_SET_OP1_TESTPATTERN XCArgs;
12834     XCArgs.ePattern = ePattern;
12835     XCArgs.eMode = eMode;
12836     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12837 
12838     if(UtopiaIoctl(pu32XCInst, E_XC_SET_OP1_TESTPATTERN, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12839     {
12840         printf("Obtain XC engine fail\n");
12841         return E_APIXC_RET_FAIL;
12842     }
12843     else
12844     {
12845         return XCArgs.eReturnValue;
12846     }
12847 }
12848 
12849 
12850 //-------------------------------------------------------------------------------------------------
12851 /// MApi_XC_Set_OP2_Pattern
12852 /// @param  bEnable               \b IN: enable/disable OP2  pattern
12853 /// @param  u16R_Data             \b IN: when enable OP2  patter ,Data Generator for r_cr constant
12854 /// @param  u16G_Data             \b IN: when enable OP2  patter ,Data Generator for g_y constant
12855 /// @param  u16B_Data             \b IN: when enable OP2  patter ,Data Generator for b_cb constant
12856 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL or E_APIXC_RET_FAIL_FUN_NOT_SUPPORT
12857 //-------------------------------------------------------------------------------------------------
MApi_XC_Set_OP2_Pattern_U2(void * pInstance,MS_BOOL bEnable,MS_U16 u16R_Data,MS_U16 u16G_Data,MS_U16 u16B_Data)12858 E_APIXC_ReturnValue MApi_XC_Set_OP2_Pattern_U2(void* pInstance, MS_BOOL bEnable, MS_U16 u16R_Data, MS_U16 u16G_Data ,MS_U16 u16B_Data)
12859 {
12860     E_APIXC_ReturnValue enResult = E_APIXC_RET_OK;
12861     #if (SUPPORT_OP2_TEST_PATTERN >0)
12862     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
12863     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
12864     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
12865     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
12866     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
12867     _XC_ENTRY(pInstance);
12868     if(bEnable == TRUE)
12869     {
12870         if(pXCResourcePrivate->stdrvXC_MVideo.bIsOP2TestPattern == FALSE)
12871         {
12872             pXCResourcePrivate->stdrvXC_MVideo.bIsOP2TestPattern = TRUE;
12873             pXCResourcePrivate->stdrvXC_MVideo.u16OP2_color_3x3 = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_2F_L,0xFFFF);
12874             pXCResourcePrivate->stdrvXC_MVideo.bIsOP2InputSrcDisabled = Hal_SC_Is_InputSource_Disable(pInstance, MAIN_WINDOW) >> 7;
12875             pXCResourcePrivate->stdrvXC_MVideo.bIsOP2Mute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1)) >> 1;
12876 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
12877             if (IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type))
12878             {
12879                 pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCMute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1)) >> 1;
12880                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, 0,BIT(1));
12881             }
12882 #endif
12883             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, 0,BIT(1));
12884             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, 0,BIT(7)); //input source disable
12885             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_2F_L,0x0000,0xFFFF); //disable 3x3
12886         }
12887         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_32_L, u16R_Data, BMASK(9:0));
12888         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_33_L, u16G_Data, BMASK(9:0));
12889         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_34_L, u16B_Data, BMASK(9:0));
12890     }
12891     else
12892     {
12893         if (pXCResourcePrivate->stdrvXC_MVideo.bIsOP2TestPattern == TRUE)
12894         {
12895             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_2F_L, pXCResourcePrivate->stdrvXC_MVideo.u16OP2_color_3x3, 0xFFFF); //restore 3x3
12896             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, (pXCResourcePrivate->stdrvXC_MVideo.bIsOP2Mute<< 1),BIT(1));
12897 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
12898             if (IsVBY1_16LANE((MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type))
12899             {
12900                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, (pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCMute<< 1),BIT(1));
12901             }
12902 #endif
12903             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, (pXCResourcePrivate->stdrvXC_MVideo.bIsOP2InputSrcDisabled<< 7),BIT(7));
12904             pXCResourcePrivate->stdrvXC_MVideo.bIsOP2TestPattern = FALSE;
12905         }
12906     }
12907 
12908     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_30_L, (bEnable), BIT(0));
12909     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_31_L, (bEnable),  BIT(0));
12910 
12911     _XC_RETURN(pInstance);
12912     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
12913 
12914     #endif
12915     return enResult;
12916 }
12917 
MApi_XC_Set_OP2_Pattern(MS_BOOL bEnable,MS_U16 u16R_Data,MS_U16 u16G_Data,MS_U16 u16B_Data)12918 E_APIXC_ReturnValue MApi_XC_Set_OP2_Pattern(MS_BOOL bEnable, MS_U16 u16R_Data, MS_U16 u16G_Data ,MS_U16 u16B_Data)
12919 {
12920     if (pu32XCInst == NULL)
12921     {
12922         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12923         return E_APIXC_RET_FAIL;
12924     }
12925 
12926     stXC_SET_OP2_TESTPATTERN  XCArgs;
12927     XCArgs.bEnable = bEnable ;
12928     XCArgs.u16R_Data = u16R_Data ;
12929     XCArgs.u16G_Data = u16G_Data;
12930     XCArgs.u16B_Data = u16B_Data;
12931     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
12932 
12933     if(UtopiaIoctl(pu32XCInst, E_XC_SET_OP2_TESTPATTERN, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12934     {
12935         printf("Obtain XC engine fail\n");
12936         return E_APIXC_RET_FAIL;
12937     }
12938     else
12939     {
12940         return XCArgs.eReturnValue;
12941     }
12942 }
12943 
12944 //-------------------------------------------------------------------------------------------------
12945 /// MApi_XC_CheckWhiteBalancePatternModeSupport
12946 /// @param  eWBPatternMode   \b IN: White balance Pattern gen Mode
12947 /// @return MS_BOOL: TRUE - support, FALSED - unsupport
12948 //-------------------------------------------------------------------------------------------------
MApi_XC_CheckWhiteBalancePatternModeSupport_U2(void * pInstance,EN_XC_WB_PATTERN_MODE enWBPatternMode)12949 MS_BOOL MApi_XC_CheckWhiteBalancePatternModeSupport_U2(void* pInstance, EN_XC_WB_PATTERN_MODE enWBPatternMode)
12950 {
12951 #ifndef DISABLE_HW_PATTERN_FUNCTION
12952     #ifdef SUPPORT_HW_TESTPATTERN
12953     if(enWBPatternMode == E_XC_OP1_PATTERN_MODE)
12954     {
12955         return TRUE;
12956     }
12957     else
12958     #endif
12959     if(SUPPORT_OP2_TEST_PATTERN)
12960     {
12961         if(enWBPatternMode == E_XC_OP2_PATTERN_MODE)
12962         {
12963             return TRUE;
12964         }
12965     }
12966     return FALSE;
12967 #else
12968     if(SUPPORT_OP2_TEST_PATTERN)
12969     {
12970         if(enWBPatternMode == E_XC_OP2_PATTERN_MODE)
12971         {
12972             return TRUE;
12973         }
12974     }
12975     return FALSE;
12976  #endif
12977 }
12978 
MApi_XC_CheckWhiteBalancePatternModeSupport(EN_XC_WB_PATTERN_MODE enWBPatternMode)12979 MS_BOOL MApi_XC_CheckWhiteBalancePatternModeSupport(EN_XC_WB_PATTERN_MODE enWBPatternMode)
12980 {
12981     if (pu32XCInst == NULL)
12982     {
12983         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
12984         return E_APIXC_RET_FAIL;
12985     }
12986 
12987     stXC_CHECK_WB_TESTPATTERN  XCArgs;
12988     XCArgs.eWBPattern = enWBPatternMode;
12989     XCArgs.eReturnValue = FALSE;
12990 
12991     if(UtopiaIoctl(pu32XCInst, E_XC_CHECK_WHITEBALANCE_PATTERN_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
12992     {
12993         printf("Obtain XC engine fail\n");
12994         return FALSE;
12995     }
12996     else
12997     {
12998         return XCArgs.eReturnValue;
12999     }
13000 }
MApi_XC_SetHLinearScaling_U2(void * pInstance,MS_BOOL bEnable,MS_BOOL bSign,MS_U16 u16Delta,SCALER_WIN eWindow)13001 E_APIXC_ReturnValue MApi_XC_SetHLinearScaling_U2(void* pInstance, MS_BOOL bEnable, MS_BOOL bSign, MS_U16 u16Delta, SCALER_WIN eWindow)
13002 {
13003 #if XC_HLINEARSCALING_VER > 0
13004     MS_U16 u16DeltaInit = 0;
13005 
13006     _XC_ENTRY(pInstance);
13007 
13008     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13009     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13010 
13011     if(bEnable)
13012     {
13013         if(0 == SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_08_L, BIT(8)))
13014         {
13015             printf("Waring: there is no H_postscaling enabled, the HLinearScaling won't work!\n");
13016         }
13017 
13018         u16DeltaInit = (960 * u16Delta) / 512;
13019 
13020         if((u16DeltaInit < 2) || (u16Delta > 0x7F) || (eWindow != MAIN_WINDOW))
13021         {
13022             _XC_RETURN(pInstance);
13023             XC_LOG_TRACE(XC_DGBLEVEL_CROPCALC,"MApi_XC_SetHLinearScaling(): u16Delta=%u, u16DeltaInit=%u, eWindow=%u\n", u16Delta, u16DeltaInit, eWindow);
13024             return E_APIXC_RET_FAIL_INVALID_PARAMETER;
13025         }
13026 
13027         XC_LOG_TRACE(XC_DGBLEVEL_CROPCALC,"MApi_XC_SetHLinearScaling(): u16DeltaInit=%u\n", u16DeltaInit);
13028 
13029         //enable
13030         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, BIT(6), BIT(6));
13031 
13032         //zone 0 width: 0x3C0
13033         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, 1<<12, BIT(12));
13034         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_14_L, 0xE0, 0x00FF);
13035         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, 1<<8, BIT(8));
13036 
13037         //zone 1 width: 0x3C0
13038         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, 1<<13, BIT(13));
13039         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_14_L, 0xE0<<8, 0xFF00);
13040         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, 1<<9, BIT(9));
13041 
13042         //zone 0 1 Delta
13043         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_16_L, (u16Delta<<8) | (u16Delta));
13044 
13045         //zone 0 1 Delta init
13046         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_15_L, u16DeltaInit<<8, 0x7F00);
13047 
13048         //Delta init Signed
13049         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_15_L, bSign<<15, BIT(15));
13050     }
13051     else
13052     {
13053         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, 0, BIT(6));
13054     }
13055 
13056     _XC_RETURN(pInstance);
13057 
13058     return E_APIXC_RET_OK;
13059 #else
13060     return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
13061 #endif
13062 }
13063 
MApi_XC_SetHLinearScaling(MS_BOOL bEnable,MS_BOOL bSign,MS_U16 u16Delta,SCALER_WIN eWindow)13064 E_APIXC_ReturnValue MApi_XC_SetHLinearScaling(MS_BOOL bEnable, MS_BOOL bSign, MS_U16 u16Delta, SCALER_WIN eWindow)
13065 {
13066     if (pu32XCInst == NULL)
13067     {
13068         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13069         return E_APIXC_RET_FAIL;
13070     }
13071 
13072     stXC_SET_HLINEARSCALING XCArgs;
13073     XCArgs.bEnable = bEnable;
13074     XCArgs.bSign = bSign;
13075     XCArgs.u16Delta = u16Delta;
13076     XCArgs.eWindow = eWindow;
13077     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13078 
13079     if(UtopiaIoctl(pu32XCInst, E_XC_SET_HLINEARSCALING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13080     {
13081         printf("Obtain XC engine fail\n");
13082         return E_APIXC_RET_FAIL;
13083     }
13084     else
13085     {
13086         return XCArgs.eReturnValue;
13087     }
13088 }
13089 
MApi_XC_EnableT3D_U2(void * pInstance,MS_BOOL bEnable)13090 E_APIXC_ReturnValue MApi_XC_EnableT3D_U2(void* pInstance, MS_BOOL bEnable)
13091 {
13092     MS_BOOL bRet = FALSE;
13093 #ifdef ENABLE_CHIP_BRINGUP
13094     bEnable = FALSE;
13095 #endif
13096     _XC_ENTRY(pInstance);
13097 #ifndef DISABLE_3D_FUNCTION
13098     bRet = MDrv_XC_EnableT3D(pInstance, bEnable);
13099 #endif
13100     _XC_RETURN(pInstance);
13101 
13102     if (bRet)
13103     {
13104         return E_APIXC_RET_OK;
13105     }
13106     else
13107     {
13108         return E_APIXC_RET_FAIL;
13109     }
13110 }
13111 
MApi_XC_EnableT3D(MS_BOOL bEnable)13112 E_APIXC_ReturnValue MApi_XC_EnableT3D(MS_BOOL bEnable)
13113 {
13114     if (pu32XCInst == NULL)
13115     {
13116         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13117         return E_APIXC_RET_FAIL;
13118     }
13119 
13120     stXC_EnableT3D XCArgs;
13121     XCArgs.bEnable = bEnable;
13122     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13123 
13124     if(UtopiaIoctl(pu32XCInst, E_XC_SET_ENABLE_T3D, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13125     {
13126         printf("Obtain XC engine fail\n");
13127         return E_APIXC_RET_FAIL;
13128     }
13129     else
13130     {
13131         return XCArgs.eReturnValue;
13132     }
13133 }
13134 
MApi_XC_Set_FRC_InputTiming_U2(void * pInstance,E_XC_FRC_InputTiming enFRC_InputTiming)13135 E_APIXC_ReturnValue MApi_XC_Set_FRC_InputTiming_U2(void* pInstance, E_XC_FRC_InputTiming enFRC_InputTiming)
13136 {
13137 #if FRC_INSIDE
13138     MS_BOOL bRet = FALSE;
13139 
13140     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13141     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13142 
13143     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13144     bRet = MDrv_XC_Set_FRC_InputTiming(pInstance, enFRC_InputTiming);
13145     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13146 
13147     if (bRet)
13148     {
13149         return E_APIXC_RET_OK;
13150     }
13151     else
13152     {
13153         return E_APIXC_RET_FAIL;
13154     }
13155 #else
13156     return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
13157 #endif
13158 }
13159 
MApi_XC_Set_FRC_InputTiming(E_XC_FRC_InputTiming enFRC_InputTiming)13160 E_APIXC_ReturnValue MApi_XC_Set_FRC_InputTiming(E_XC_FRC_InputTiming enFRC_InputTiming)
13161 {
13162     if (pu32XCInst == NULL)
13163     {
13164         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13165         return E_APIXC_RET_FAIL;
13166     }
13167 
13168     stXC_Set_FRC_InputTiming XCArgs;
13169     XCArgs.enFRC_InputTiming = enFRC_InputTiming;
13170     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13171 
13172     if(UtopiaIoctl(pu32XCInst, E_XC_SET_FRC_INPUTTIMING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13173     {
13174         printf("Obtain XC engine fail\n");
13175         return E_APIXC_RET_FAIL;
13176     }
13177     else
13178     {
13179         return XCArgs.eReturnValue;
13180     }
13181 }
13182 
MApi_XC_Get_FRC_InputTiming_U2(void * pInstance,E_XC_FRC_InputTiming * penFRC_InputTiming)13183 E_APIXC_ReturnValue MApi_XC_Get_FRC_InputTiming_U2(void* pInstance, E_XC_FRC_InputTiming *penFRC_InputTiming)
13184 {
13185 #if FRC_INSIDE
13186     MS_BOOL bRet = FALSE;
13187     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13188     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13189     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13190 
13191     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13192 
13193     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13194     if(penFRC_InputTiming)
13195     {
13196         *penFRC_InputTiming = pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming;
13197         bRet = TRUE;
13198     }
13199     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13200 
13201     if (bRet)
13202     {
13203         return E_APIXC_RET_OK;
13204     }
13205     else
13206     {
13207         return E_APIXC_RET_FAIL;
13208     }
13209 #else
13210     return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
13211 #endif
13212 }
13213 
MApi_XC_Get_FRC_InputTiming(E_XC_FRC_InputTiming * penFRC_InputTiming)13214 E_APIXC_ReturnValue MApi_XC_Get_FRC_InputTiming(E_XC_FRC_InputTiming *penFRC_InputTiming)
13215 {
13216     if (pu32XCInst == NULL)
13217     {
13218         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13219         return E_APIXC_RET_FAIL;
13220     }
13221 
13222     stXC_Get_FRC_InputTiming XCArgs;
13223     XCArgs.penFRC_InputTiming = penFRC_InputTiming;
13224     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13225 
13226     if(UtopiaIoctl(pu32XCInst, E_XC_GET_FRC_INPUTTIMING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13227     {
13228         printf("Obtain XC engine fail\n");
13229         return E_APIXC_RET_FAIL;
13230     }
13231     else
13232     {
13233         return XCArgs.eReturnValue;
13234     }
13235 }
13236 #if 0
13237 E_APIXC_ReturnValue MApi_XC_Get_VirtualBox_Info_U2(void* pInstance, XC_VBOX_INFO *pstXC_VboxInfo)
13238 {
13239     MS_BOOL bRet = FALSE;
13240     MS_U8 u8FrameCnt = 0;
13241     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13242     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13243     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13244     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13245     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13246 
13247     if(pstXC_VboxInfo)
13248     {
13249         pstXC_VboxInfo->u32FBSize[0] = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size;
13250         pstXC_VboxInfo->u32FBSize[1] = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size;
13251         pstXC_VboxInfo->u16VBox_PanelHsize = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width;
13252         pstXC_VboxInfo->u16VBox_PanelVsize = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height;
13253 
13254         // temp for sub
13255         pstXC_VboxInfo->u16VBox_Htotal[1] = 1920;
13256         pstXC_VboxInfo->u16VBox_Vtotal[1] = 1080;
13257 
13258         if(XC_SUPPORT_4K2K)
13259         {
13260             // in 4K2K case, the Madi mode is P_Mode10 = 20bit/pixels
13261             u8FrameCnt = (pstXC_VboxInfo->u32FBSize[0]) / (pstXC_VboxInfo->u16VBox_PanelHsize*pstXC_VboxInfo->u16VBox_PanelVsize * 20/8);
13262             if(u8FrameCnt >= 2)
13263             {
13264         #if FRC_INSIDE
13265                 /// FRC Enable
13266                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited)
13267                 {
13268                     if(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_4K2K)
13269                     {
13270                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
13271                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
13272                     }
13273                     else //if(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_2K1K)) and others
13274                     {
13275                         // 2K2K only for Napoli with FRC_On
13276                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13277                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080*2;
13278                     }
13279                 }
13280                 else  /// FRC Disable
13281                 {
13282                     if((pstXC_VboxInfo->u16Vfreq[0] <= 300)&&(pstXC_VboxInfo->bInterface[0] == FALSE))
13283                     {
13284                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
13285                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
13286                     }
13287                     else
13288                     {
13289                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13290                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
13291                     }
13292                 }
13293             #else
13294                 if(0)//(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_MONACO_MODE)
13295                 {
13296                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
13297                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
13298                 }
13299                 else // exp : Nike, Monaco_legacy_mode
13300                 {
13301                     if((pstXC_VboxInfo->u16Vfreq[0] <= 300)&&(pstXC_VboxInfo->bInterface[0] == FALSE))
13302                     {
13303                         pstXC_VboxInfo->u16VBox_Htotal[0] = 3840;
13304                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 2160;
13305                     }
13306                     else
13307                     {
13308                         pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13309                         pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
13310                     }
13311                 }
13312         #endif
13313             }
13314             else
13315             {
13316         #if FRC_INSIDE
13317                 if(pXCResourcePrivate->stdrvXC_MVideo_Context.bIsFRCInited
13318                  &&(pXCResourcePrivate->stdrvXC_MVideo_Context.enFRC_CurrentInputTiming == E_XC_FRC_InputTiming_2K1K))
13319                 {
13320                     // 2K2K only for Napoli with FRC_On
13321                     pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13322                     pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080*2;
13323                 }
13324                 else
13325         #endif
13326                 {
13327                     pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13328                     pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
13329                 }
13330             }
13331         }
13332         else
13333         {
13334             pstXC_VboxInfo->u16VBox_Htotal[0] = 1920;
13335             pstXC_VboxInfo->u16VBox_Vtotal[0] = 1080;
13336         }
13337         bRet = TRUE;
13338     }
13339     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13340 
13341     if (bRet)
13342     {
13343         return E_APIXC_RET_OK;
13344     }
13345     else
13346     {
13347         return E_APIXC_RET_FAIL;
13348     }
13349 }
13350 
13351 E_APIXC_ReturnValue MApi_XC_Get_VirtualBox_Info(XC_VBOX_INFO *pstXC_VboxInfo)
13352 {
13353     if (pu32XCInst == NULL)
13354     {
13355         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13356         return E_APIXC_RET_FAIL;
13357     }
13358 
13359     stXC_Get_VBOX_Info XCArgs;
13360     XCArgs.pstXC_VboxInfo = pstXC_VboxInfo;
13361     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13362 
13363     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_VBOX_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13364     {
13365         return E_APIXC_RET_FAIL;
13366     }
13367     else
13368     {
13369         return XCArgs.eReturnValue;
13370     }
13371 }
13372 #endif
MApi_XC_Set_OSD_Detect_U2(void * pInstance,MS_BOOL bEnable,MS_U32 Threhold)13373 E_APIXC_ReturnValue MApi_XC_Set_OSD_Detect_U2(void* pInstance,MS_BOOL bEnable, MS_U32 Threhold)
13374 {
13375     MS_BOOL bRet = FALSE;
13376     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13377     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13378 
13379     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13380     bRet = Hal_SC_SetOSDDetect(pInstance, bEnable,Threhold);
13381     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13382 
13383     if (bRet)
13384     {
13385         return E_APIXC_RET_OK;
13386     }
13387     else
13388     {
13389         return E_APIXC_RET_FAIL;
13390     }
13391 }
13392 
MApi_XC_Set_OSD_Detect(MS_BOOL bEnable,MS_U32 Threhold)13393 E_APIXC_ReturnValue MApi_XC_Set_OSD_Detect(MS_BOOL bEnable, MS_U32 Threhold)
13394 {
13395     if (pu32XCInst == NULL)
13396     {
13397         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13398         return E_APIXC_RET_FAIL;
13399     }
13400 
13401     stXC_Set_OSD_DETECT XCArgs;
13402     XCArgs.bEnable = bEnable;
13403     XCArgs.Threhold = Threhold;
13404     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13405 
13406     if(UtopiaIoctl(pu32XCInst, E_XC_SET_OSD_DETECT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13407     {
13408         printf("Obtain XC engine fail\n");
13409         return E_APIXC_RET_FAIL;
13410     }
13411     else
13412     {
13413         return XCArgs.eReturnValue;
13414     }
13415 }
13416 
MApi_XC_Get_OSD_Detect_U2(void * pInstance,MS_BOOL * pbOSD)13417 E_APIXC_ReturnValue MApi_XC_Get_OSD_Detect_U2(void* pInstance,MS_BOOL *pbOSD)
13418 {
13419     MS_BOOL bRet = FALSE;
13420     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13421     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13422 
13423     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13424     bRet = Hal_SC_GetOSDDetect(pInstance, pbOSD);
13425     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13426 
13427     if (bRet)
13428     {
13429         return E_APIXC_RET_OK;
13430     }
13431     else
13432     {
13433         return E_APIXC_RET_FAIL;
13434     }
13435 }
13436 
MApi_XC_Get_OSD_Detect(MS_BOOL * pbOSD)13437 E_APIXC_ReturnValue MApi_XC_Get_OSD_Detect(MS_BOOL *pbOSD)
13438 {
13439     if (pu32XCInst == NULL)
13440     {
13441         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13442         return E_APIXC_RET_FAIL;
13443     }
13444 
13445     stXC_Get_OSD_DETECT XCArgs;
13446     XCArgs.pbOSD = pbOSD;
13447     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13448 
13449     if(UtopiaIoctl(pu32XCInst, E_XC_GET_OSD_DETECT, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13450     {
13451         printf("Obtain XC engine fail\n");
13452         return E_APIXC_RET_FAIL;
13453     }
13454     else
13455     {
13456         return XCArgs.eReturnValue;
13457     }
13458 }
13459 
MApi_XC_Is2K2KToFrcMode_U2(void * pInstance)13460 MS_BOOL MApi_XC_Is2K2KToFrcMode_U2(void* pInstance)
13461 {
13462     MS_BOOL bRet = FALSE;
13463     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13464     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13465     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13466     bRet = MDrv_XC_Is2K2KToFrc(pInstance);
13467     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13468     return bRet;
13469 }
13470 
MApi_XC_Is2K2KToFrcMode(void)13471 MS_BOOL MApi_XC_Is2K2KToFrcMode(void)
13472 {
13473     //return MDrv_XC_Is2K2KToFrc();
13474     if (pu32XCInst == NULL)
13475     {
13476         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13477         return E_APIXC_RET_FAIL;
13478     }
13479 
13480     stXC_Is2K2KToFrcMode  XCArgs;
13481     XCArgs.bReturnValue = FALSE;
13482 
13483     if(UtopiaIoctl(pu32XCInst, E_XC_IS2K2KTOFRCMODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13484     {
13485         printf("Obtain XC engine fail\n");
13486         return FALSE;
13487     }
13488     else
13489     {
13490         return XCArgs.bReturnValue;
13491     }
13492 }
13493 
MApi_XC_Set_XC_VOP_U2(void * pInstance,MS_XC_VOP_Data stXCVOPData)13494 MS_BOOL MApi_XC_Set_XC_VOP_U2(void * pInstance, MS_XC_VOP_Data stXCVOPData)
13495 {
13496 
13497     MS_BOOL bResult = TRUE;
13498 
13499     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13500     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13501 
13502     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13503 
13504     printf("[%s][%d]pPNLInstancePrivate->u32DeviceID= %tx\n", __FUNCTION__, __LINE__, (ptrdiff_t)psXCInstPri->u32DeviceID);
13505     if(psXCInstPri->u32DeviceID == 0)
13506     {
13507         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13508         return FALSE;
13509     }
13510 
13511     MDrv_XC_Set_VOP(pInstance, &stXCVOPData);
13512 
13513     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13514 
13515     return bResult;
13516 }
13517 
MApi_XC_Set_XC_VOP(MS_XC_VOP_Data stXCVOPData)13518 MS_BOOL MApi_XC_Set_XC_VOP(MS_XC_VOP_Data stXCVOPData)
13519 {
13520     if (pu32XCInst == NULL)
13521     {
13522         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13523         return E_APIXC_RET_FAIL;
13524     }
13525 
13526     stXC_SetXC_VOP XCArgs;
13527     XCArgs.stXC_VOPData = stXCVOPData;
13528     XCArgs.bReturn = FALSE;
13529     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_XC_VOP, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13530     {
13531         printf("Obtain PNL engine fail\n");
13532         return FALSE;
13533     }
13534     else
13535     {
13536         return XCArgs.bReturn;
13537     }
13538 
13539 }
13540 
13541 //K3_U2
13542 #if 0
13543 //-------------------------------------------------------------------------------------------------
13544 /// MApi_XC_EX_Set_WhiteBalance_Pattern
13545 /// @param  bEnable                  \b IN: enable/disable white balance test pattern
13546 /// @param  u16R_CR_Data             \b IN: when enable white balance test pattern ,Data Generator for r_cr constant
13547 /// @param  u16G_Y_Data              \b IN: when enable white balance test pattern ,Data Generator for g_y constant
13548 /// @param  u16B_CB_Data             \b IN: when enable white balance test pattern ,Data Generator for b_cb constant
13549 /// @return E_APIXC_RET_OK or E_APIXC_RET_FAIL or E_APIXC_RET_FAIL_FUN_NOT_SUPPORT
13550 //-------------------------------------------------------------------------------------------------
13551 E_APIXC_ReturnValue MApi_XC_EX_Set_WhiteBalance_Pattern_U2(XC_DEVICE_ID *pDeviceId, MS_BOOL bEnable, MS_U16 u16R_CR_Data, MS_U16 u16G_Y_Data ,MS_U16 u16B_CB_Data)
13552 {
13553     XC_EX_RETURN_VALUE enResult = E_XC_EX_RET_OK;
13554 
13555     W2BYTEMSK(REG_IPMUX_10_L, (bEnable << 9) , BIT(9));
13556     W2BYTEMSK(REG_IPMUX_10_L, (bEnable << 12), BIT(12));
13557     W2BYTEMSK(REG_IPMUX_10_L, (bEnable << 13), BIT(13));
13558     W2BYTEMSK(REG_IPMUX_10_L, (bEnable << 14), BIT(14));
13559 
13560     if(bEnable == TRUE)
13561     {
13562         W2BYTEMSK(REG_IPMUX_1D_L, u16R_CR_Data, BMASK(9:0));
13563         W2BYTEMSK(REG_IPMUX_1E_L, u16G_Y_Data,  BMASK(9:0));
13564         W2BYTEMSK(REG_IPMUX_1F_L, u16B_CB_Data, BMASK(9:0));
13565     }
13566 
13567     return enResult;
13568 }
13569 
13570 E_APIXC_ReturnValue MApi_XC_Get_FRC_InputTiming(E_XC_FRC_InputTiming *penFRC_InputTiming)
13571 {
13572     if (pu32XCInst == NULL)
13573     {
13574         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13575         return E_APIXC_RET_FAIL;
13576     }
13577 
13578     stXC_Get_FRC_InputTiming XCArgs;
13579     XCArgs.penFRC_InputTiming = penFRC_InputTiming;
13580     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13581 
13582     if(UtopiaIoctl(pu32XCInst, E_XC_GET_FRC_INPUTTIMING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13583     {
13584         printf("Obtain XC engine fail\n");
13585         return E_APIXC_RET_FAIL;
13586     }
13587     else
13588     {
13589         return XCArgs.eReturnValue;
13590     }
13591 }
13592 #endif
13593 
13594 //-------------------------------------------------------------------------------------------------
13595 /// Get SWDSIndex
13596 /// @return @ref MS_U8 return SWDSIndex
13597 //-------------------------------------------------------------------------------------------------
MApi_XC_GetSWDSIndex_U2(void * pInstance)13598 MS_U8 MApi_XC_GetSWDSIndex_U2(void* pInstance)
13599 {
13600     MS_U8 u8SWDSIndex;
13601     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13602     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13603     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13604     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13605     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13606 
13607     if(MDrv_XC_Is_SupportSWDS(pInstance))
13608     {
13609 #if (SUPPORT_KERNEL_DS == 1)
13610         u8SWDSIndex = MDrv_XC_GetSWDSIndex(pInstance, MAIN_WINDOW);
13611 #else
13612         u8SWDSIndex = pXCResourcePrivate->sthal_SC.u8DynamicScalingNextIndex[MAIN_WINDOW];
13613 #endif
13614     }
13615     else
13616     {
13617         u8SWDSIndex = 0;
13618     }
13619     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13620     return u8SWDSIndex;
13621 
13622 }
13623 
13624 #ifdef MSOS_TYPE_LINUX_KERNEL
MApi_XC_GetSWDSIndex(SCALER_WIN eWindow)13625 MS_U8 MApi_XC_GetSWDSIndex(SCALER_WIN eWindow)
13626 #else
13627 __attribute__((weak)) MS_U8 MApi_XC_GetSWDSIndex(SCALER_WIN eWindow)
13628 #endif
13629 {
13630 
13631     if (pu32XCInst == NULL)
13632     {
13633         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13634         return 0;
13635     }
13636 
13637     stXC_GET_SWDSIndex XCArgs;
13638     XCArgs.u8ReturnValue = 0;
13639 
13640     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_SWDSIndex, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)  //E_XC_CMD_GET_SWDSIndex
13641     {
13642         printf("Obtain XC engine fail\n");
13643         return 0;
13644     }
13645     else
13646     {
13647         return XCArgs.u8ReturnValue;
13648     }
13649 
13650 }
13651 
13652 //-------------------------------------------------------------------------------------------------
13653 /// Set DNR base0 address
13654 /// @param  u32FBAddress      \b IN: the framebuffer address
13655 /// @param  u32FBSize         \b IN: the framebuffer size
13656 //-------------------------------------------------------------------------------------------------
MApi_XC_SetDualFrameBufferAddress_U2(void * pInstance,MS_PHY u32FBAddress,MS_PHY u32FBSize,SCALER_WIN eWindow)13657 MS_BOOL MApi_XC_SetDualFrameBufferAddress_U2(void* pInstance, MS_PHY u32FBAddress, MS_PHY u32FBSize, SCALER_WIN eWindow)
13658 {
13659     MS_BOOL bReturn = FALSE;
13660     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13661     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13662     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13663     _XC_ENTRY(pInstance);
13664     bReturn = MDrv_XC_SetDualFrameBufferAddress(pInstance, u32FBAddress, u32FBSize, eWindow);
13665     _XC_RETURN(pInstance);
13666     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13667     return bReturn;
13668 }
13669 
13670 #ifdef UFO_XC_SUPPORT_DUAL_MIU
MApi_XC_EnableMiuDualMode_U2(void * pInstance,MS_BOOL bEnable,MS_U32 u32LeftFactor,MS_U32 u32RightFactor,SCALER_WIN eWindow)13671 MS_BOOL MApi_XC_EnableMiuDualMode_U2(void* pInstance, MS_BOOL bEnable, MS_U32 u32LeftFactor, MS_U32 u32RightFactor, SCALER_WIN eWindow)
13672 {
13673     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13674     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13675     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13676     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13677 #ifndef XC_DUAL_MIU_SUPPORT_SUBWIN
13678     if (eWindow == MAIN_WINDOW)
13679     {
13680 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
13681         if (psXCInstPri->u32DeviceID != 0)
13682         {
13683             XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "XC SCMI Dual miu just support main window only.\n");
13684             return FALSE;
13685         }
13686 #endif
13687     }
13688     else
13689     {
13690         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "XC SCMI Dual miu just support main window only.\n");
13691         return FALSE;
13692     }
13693 #endif
13694 
13695     if(!((u32RightFactor <= 3*u32LeftFactor) && (u32LeftFactor <= 3*u32RightFactor)))
13696     {
13697         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "error params u32LeftFactor: %d, u32RightFactor: %d.\n", u32LeftFactor, u32RightFactor);
13698         return FALSE;
13699     }
13700 
13701     gSrcInfo[eWindow].Status2.stMiuDualModCfg.bEnableMiuDualMod = bEnable;
13702     gSrcInfo[eWindow].Status2.stMiuDualModCfg.u32LeftFactor = u32LeftFactor;
13703     gSrcInfo[eWindow].Status2.stMiuDualModCfg.u32RightFactor = u32RightFactor;
13704     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "u32LeftFactor: %d, u32RightFactor: %d.\n", u32LeftFactor, u32RightFactor);
13705     return TRUE;
13706 }
13707 
MApi_XC_EnableMiuDualMode(MS_BOOL bEnable,MS_U32 u32LeftFactor,MS_U32 u32RightFactor,SCALER_WIN eWindow)13708 MS_BOOL  MApi_XC_EnableMiuDualMode(MS_BOOL bEnable, MS_U32 u32LeftFactor, MS_U32 u32RightFactor, SCALER_WIN eWindow)
13709 {
13710     if (pu32XCInst == NULL)
13711     {
13712         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_SetBwdConfig() first\n",__FUNCTION__,__LINE__);
13713         return FALSE;
13714     }
13715 
13716     stXC_EnableDualMode XCArgs;
13717     XCArgs.bEnable       = bEnable;
13718     XCArgs.u32LeftFactor = u32LeftFactor;
13719     XCArgs.u32RightFactor= u32RightFactor;
13720     XCArgs.eWindow = eWindow;
13721     XCArgs.bReturnValue = FALSE;
13722 
13723     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_ENABLE_DUAL_MODE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13724     {
13725         printf("Obtain XC engine fail\n");
13726         return FALSE;
13727     }
13728     else
13729     {
13730         return XCArgs.bReturnValue;
13731     }
13732 }
13733 #endif
13734 
13735 #ifdef SUPPORT_BWD
MApi_XC_SetBwdConfig_U2(void * pInstance,E_XC_BWD_CONFIG_TYPE eType,void * pstParam,SCALER_WIN eWindow)13736 MS_BOOL MApi_XC_SetBwdConfig_U2(void* pInstance, E_XC_BWD_CONFIG_TYPE eType, void *pstParam, SCALER_WIN eWindow )
13737 {
13738     MS_BOOL bResult = FALSE;
13739     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
13740     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
13741 
13742     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
13743     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
13744 
13745     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13746     _XC_ENTRY(pInstance);
13747     bResult = MDrv_SC_setBwdConfig(pInstance, eType, pstParam, eWindow);
13748       _XC_RETURN(pInstance);
13749       _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13750     return bResult;
13751 }
13752 
MApi_XC_SetBwdConfig(E_XC_BWD_CONFIG_TYPE eType,void * pstParam,SCALER_WIN eWindow)13753 MS_BOOL MApi_XC_SetBwdConfig(E_XC_BWD_CONFIG_TYPE eType, void *pstParam, SCALER_WIN eWindow )
13754 {
13755     if (pu32XCInst == NULL)
13756     {
13757         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_SetBwdConfig() first\n",__FUNCTION__,__LINE__);
13758         return FALSE;
13759     }
13760 
13761     stXC_SetBwdConfig XCArgs;
13762     XCArgs.eType = eType;
13763     XCArgs.pstParam = pstParam;
13764     XCArgs.eWindow = eWindow;
13765     XCArgs.bReturnValue = FALSE;
13766 
13767     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_BWD_CONFIG, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13768     {
13769         printf("Obtain XC engine fail\n");
13770         return FALSE;
13771     }
13772     else
13773     {
13774         return XCArgs.bReturnValue;
13775     }
13776 }
13777 #endif
13778 
MApi_XC_IsSupport2StepScaling_U2(void * pInstance)13779 MS_BOOL MApi_XC_IsSupport2StepScaling_U2(void* pInstance)
13780 {
13781     return MDrv_XC_IsSupport2StepScaling();
13782 }
13783 
MApi_XC_IsSupport2StepScaling(void)13784 MS_BOOL MApi_XC_IsSupport2StepScaling(void)
13785 {
13786     if (pu32XCInst == NULL)
13787     {
13788         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13789         return E_APIXC_RET_FAIL;
13790     }
13791 
13792     stXC_IsSupport2StepScaling XCArgs;
13793     XCArgs.bReturnValue = FALSE;
13794 
13795     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_IS_SUPPORT_2_STEP_SCALING, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13796     {
13797         printf("Obtain XC engine fail\n");
13798         return FALSE;
13799     }
13800     else
13801     {
13802         return XCArgs.bReturnValue;
13803     }
13804 }
13805 
13806 
13807 
MApi_XC_SetForceWrite_U2(void * pInstance,EN_MUTE_TYPE enMuteType,MS_BOOL bIsForceWrite)13808 E_APIXC_ReturnValue MApi_XC_SetForceWrite_U2( void* pInstance, EN_MUTE_TYPE enMuteType, MS_BOOL bIsForceWrite)
13809 {
13810     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
13811    _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13812     MDrv_SC_SetForceWrite( enMuteType, bIsForceWrite);
13813     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13814     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
13815     return E_APIXC_RET_OK;
13816 }
13817 
MApi_XC_SetForceWrite(EN_MUTE_TYPE enMuteType,MS_BOOL bIsForceWrite)13818 E_APIXC_ReturnValue MApi_XC_SetForceWrite( EN_MUTE_TYPE enMuteType, MS_BOOL bIsForceWrite)
13819 {
13820     if (pu32XCInst == NULL)
13821     {
13822         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13823         return E_APIXC_RET_FAIL;
13824     }
13825 
13826     stXC_SET_FORCE_WRITE XCArgs;
13827     XCArgs.enMuteType = enMuteType;
13828     XCArgs.bIsForceWrite = bIsForceWrite;
13829     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13830 
13831     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_FORCE_WRITE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13832     {
13833         printf("Obtain XC engine fail\n");
13834 
13835         return E_APIXC_RET_FAIL;
13836     }
13837     else
13838     {
13839         return XCArgs.eReturnValue;
13840     }
13841 
13842 }
13843 
13844 
MApi_XC_GetForceWrite_U2(void * pInstance,EN_MUTE_TYPE enMuteType)13845 MS_BOOL MApi_XC_GetForceWrite_U2( void* pInstance, EN_MUTE_TYPE enMuteType)
13846 {
13847     MS_BOOL bret = FALSE;
13848     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
13849    _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13850     bret = MDrv_SC_GetForceWrite( enMuteType);
13851     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13852     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
13853     return bret;
13854 }
13855 
MApi_XC_GetForceWrite(EN_MUTE_TYPE enMuteType)13856 MS_BOOL MApi_XC_GetForceWrite( EN_MUTE_TYPE enMuteType)
13857 {
13858     if (pu32XCInst == NULL)
13859     {
13860         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13861         return E_APIXC_RET_FAIL;
13862     }
13863 
13864     stXC_GET_FORCE_WRITE XCArgs;
13865     XCArgs.enMuteType = enMuteType;
13866     XCArgs.eReturnValue = FALSE;
13867 
13868     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_FORCE_WRITE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13869     {
13870         printf("Obtain XC engine fail\n");
13871         return FALSE;
13872     }
13873     else
13874     {
13875         printf("G eReturnValue = %d\n",(XCArgs.eReturnValue == TRUE));
13876         return XCArgs.eReturnValue;
13877     }
13878 
13879 }
13880 
MApi_XC_VideoPlaybackCtrl_U2(void * pInstance,MS_U32 u32Cmd,void * pCmdArgs,MS_U32 u32CmdArgsSize)13881 E_APIXC_ReturnValue MApi_XC_VideoPlaybackCtrl_U2(void* pInstance,MS_U32 u32Cmd,void *pCmdArgs,MS_U32 u32CmdArgsSize)
13882 {
13883     MS_BOOL bret = E_APIXC_RET_FAIL;
13884     switch(u32Cmd)
13885     {
13886         case E_XC_VPC_MULTI_SPEED_PLAYBACK_CTRL:
13887             if(u32CmdArgsSize == sizeof(ST_XC_VPC_MULTI_SPEED_PLAYBACK_CTRL))
13888             {
13889                 ST_XC_VPC_MULTI_SPEED_PLAYBACK_CTRL *stXCVpcMultiSpeedPlaybackCtrl = (ST_XC_VPC_MULTI_SPEED_PLAYBACK_CTRL *)pCmdArgs;
13890 
13891                 _XC_ENTRY(pInstance);
13892                 MDrv_XC_SetForceCurrentReadBank(pInstance, stXCVpcMultiSpeedPlaybackCtrl ->bEnable, stXCVpcMultiSpeedPlaybackCtrl ->eWindow);
13893                 _XC_RETURN(pInstance);
13894                 bret = E_APIXC_RET_OK;
13895             }
13896             else
13897             {
13898                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"E_XC_VPC_MULTI_SPEED_PLAYBACK_I_Mode Struct Size No Match\n");
13899                 return bret;
13900             }
13901             break;
13902 
13903         default:
13904             printf("Unknow Handle ID!\n");
13905             break;
13906     }
13907 
13908     return bret;
13909 }
13910 
MApi_XC_VideoPlaybackCtrl(MS_U32 u32Cmd,void * pCmdArgs,MS_U32 u32CmdArgsSize)13911 E_APIXC_ReturnValue SYMBOL_WEAK MApi_XC_VideoPlaybackCtrl(MS_U32 u32Cmd,void *pCmdArgs,MS_U32 u32CmdArgsSize)
13912 {
13913     if (pu32XCInst == NULL)
13914     {
13915         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13916         return E_APIXC_RET_FAIL;
13917     }
13918 
13919     stXC_VIDEO_PLAYBACK_CTRL XCArgs;
13920     XCArgs.u32Cmd = u32Cmd;
13921     XCArgs.pCmdArgs = pCmdArgs;
13922     XCArgs.u32CmdArgsSize = u32CmdArgsSize;
13923     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13924     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_VIDEO_PLAYBACK_CTRL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13925     {
13926         printf("Obtain PNL engine fail\n");
13927         return E_APIXC_RET_FAIL;
13928     }
13929     else
13930     {
13931         return XCArgs.eReturnValue;
13932     }
13933 }
13934 
13935 #ifdef UFO_XC_AUTO_DOWNLOAD
MApi_XC_AutoDownload_Config_U2(void * pInstance,XC_AUTODOWNLOAD_CONFIG_INFO * pstConfigInfo)13936 E_APIXC_ReturnValue MApi_XC_AutoDownload_Config_U2(void* pInstance, XC_AUTODOWNLOAD_CONFIG_INFO *pstConfigInfo)
13937 {
13938     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
13939     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
13940     XC_AUTODOWNLOAD_CONFIG_INFO stConfigInfo;
13941     MS_U16 u16CopiedLength = sizeof(stConfigInfo);
13942 
13943     memset(&stConfigInfo, 0, sizeof(stConfigInfo));
13944     VERSION_COMPATIBLE_CHECK(pstConfigInfo, stConfigInfo, u16CopiedLength, u32ConfigInfo_Version, u16ConfigInfo_Length, AUTODOWNLOAD_CONFIG_INFO_VERSION);
13945     pstConfigInfo->u32ConfigInfo_Version = AUTODOWNLOAD_CONFIG_INFO_VERSION; /*Return the actual version of the returned value for APP to use*/
13946     pstConfigInfo->u16ConfigInfo_Length = u16CopiedLength; /*Return the actual length of the returned value for APP to know whick info is valid*/
13947     memcpy(&stConfigInfo, pstConfigInfo, u16CopiedLength);
13948 
13949     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
13950     _XC_ENTRY(pInstance);
13951 
13952     eRet = MDrv_XC_AutoDownload_Config(pInstance, &stConfigInfo);
13953 
13954     _XC_RETURN(pInstance);
13955     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
13956     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
13957 
13958     return eRet;
13959 }
13960 
MApi_XC_AutoDownload_Config(XC_AUTODOWNLOAD_CONFIG_INFO * pstConfigInfo)13961 E_APIXC_ReturnValue SYMBOL_WEAK MApi_XC_AutoDownload_Config(XC_AUTODOWNLOAD_CONFIG_INFO *pstConfigInfo)
13962 {
13963     if (pu32XCInst == NULL)
13964     {
13965         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
13966         return E_APIXC_RET_FAIL;
13967     }
13968 
13969     stXC_AUTODOWNLOAD_CONFIG_CTRL XCArgs;
13970     XCArgs.pstConfigInfo = pstConfigInfo;
13971     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
13972     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_AUTODOWNLOAD_CONFIG_CTRL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
13973     {
13974         printf("Obtain XC engine fail\n");
13975         return E_APIXC_RET_FAIL;
13976     }
13977     else
13978     {
13979         return XCArgs.eReturnValue;
13980     }
13981 }
13982 
MApi_XC_AutoDownload_Write_U2(void * pInstance,XC_AUTODOWNLOAD_DATA_INFO * pstDataInfo)13983 E_APIXC_ReturnValue MApi_XC_AutoDownload_Write_U2(void* pInstance, XC_AUTODOWNLOAD_DATA_INFO *pstDataInfo)
13984 {
13985     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
13986     XC_AUTODOWNLOAD_DATA_INFO stDataInfo;
13987     MS_U16 u16CopiedLength = sizeof(stDataInfo);
13988     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
13989 
13990     XC_LOG_TRACE(XC_DBGLEVEL_PARAMETER_TRACE, "Write auto download(client: %d, size: %d).\n",
13991         pstDataInfo->enClient, pstDataInfo->u32Size);
13992 
13993     XC_LOG_TRACE(XC_DBGLEVEL_PARAMETER_TRACE, "Write auto download(client: %d).\n", pstDataInfo->enClient);
13994 
13995     memset(&stDataInfo, 0, sizeof(stDataInfo));
13996     VERSION_COMPATIBLE_CHECK(pstDataInfo, stDataInfo, u16CopiedLength, u32DataInfo_Version, u16DataInfo_Length, AUTODOWNLOAD_DATA_INFO_VERSION);
13997     pstDataInfo->u32DataInfo_Version = AUTODOWNLOAD_DATA_INFO_VERSION; /*Return the actual version of the returned value for APP to use*/
13998     pstDataInfo->u16DataInfo_Length = u16CopiedLength; /*Return the actual length of the returned value for APP to know whick info is valid*/
13999     memcpy(&stDataInfo, pstDataInfo, u16CopiedLength);
14000 
14001     XC_AUTODOWNLOAD_FORMAT_INFO stFormatInfo;
14002     u16CopiedLength = sizeof(stFormatInfo);
14003     memset(&stFormatInfo, 0, sizeof(stFormatInfo));
14004     if (stDataInfo.enClient == E_XC_AUTODOWNLOAD_CLIENT_HDR)
14005     {
14006         XC_AUTODOWNLOAD_FORMAT_INFO* pstFormatInfo = (XC_AUTODOWNLOAD_FORMAT_INFO *)stDataInfo.pParam;
14007         XC_LOG_TRACE(XC_DBGLEVEL_PARAMETER_TRACE, "Write auto download, Size: %d, SubClient: %d, AddrRange(enable, start, end) = (%d, %td, %td).\n",
14008             stDataInfo.u32Size, pstFormatInfo->enSubClient, pstFormatInfo->bEnableRange, (ptrdiff_t)pstFormatInfo->u16StartAddr, (ptrdiff_t)pstFormatInfo->u16EndAddr);
14009 
14010         VERSION_COMPATIBLE_CHECK(pstFormatInfo, stFormatInfo, u16CopiedLength, u32FormatInfo_Version, u16FormatInfo_Length, AUTODOWNLOAD_FORMAT_INFO_VERSION);
14011         pstFormatInfo->u32FormatInfo_Version = AUTODOWNLOAD_FORMAT_INFO_VERSION; /*Return the actual version of the returned value for APP to use*/
14012         pstFormatInfo->u16FormatInfo_Length = u16CopiedLength; /*Return the actual length of the returned value for APP to know whick info is valid*/
14013         memcpy(&stFormatInfo, pstFormatInfo, u16CopiedLength);
14014 
14015         stDataInfo.pParam = &stFormatInfo;
14016     }
14017 
14018     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14019     _XC_ENTRY(pInstance);
14020 
14021     eRet = MDrv_XC_AutoDownload_Write(pInstance, &stDataInfo);
14022 
14023     _XC_RETURN(pInstance);
14024     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14025     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
14026 
14027     return eRet;
14028 }
14029 
MApi_XC_AutoDownload_Write(XC_AUTODOWNLOAD_DATA_INFO * pstDataInfo)14030 E_APIXC_ReturnValue SYMBOL_WEAK MApi_XC_AutoDownload_Write(XC_AUTODOWNLOAD_DATA_INFO *pstDataInfo)
14031 {
14032     if (pu32XCInst == NULL)
14033     {
14034         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14035         return E_APIXC_RET_FAIL;
14036     }
14037     stXC_AUTODOWNLOAD_WRITE_CTRL XCArgs;
14038     XCArgs.pstDataInfo= pstDataInfo;
14039     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
14040     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_AUTODOWNLOAD_WRITE_CTRL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14041     {
14042         printf("Obtain XC engine fail\n");
14043         return E_APIXC_RET_FAIL;
14044     }
14045     else
14046     {
14047         return XCArgs.eReturnValue;
14048     }
14049 }
14050 
MApi_XC_AutoDownload_Fire_U2(void * pInstance,EN_XC_AUTODOWNLOAD_CLIENT enClient)14051 E_APIXC_ReturnValue MApi_XC_AutoDownload_Fire_U2(void* pInstance, EN_XC_AUTODOWNLOAD_CLIENT enClient)
14052 {
14053     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
14054     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
14055     XC_LOG_TRACE(XC_DBGLEVEL_PARAMETER_TRACE, "Fire auto download(client: %d).\n", enClient);
14056 
14057     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14058     _XC_ENTRY(pInstance);
14059 
14060     eRet = MDrv_XC_AutoDownload_Fire(pInstance, enClient);
14061 
14062     _XC_RETURN(pInstance);
14063     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14064     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
14065 
14066     return eRet;
14067 }
14068 
MApi_XC_AutoDownload_Fire(EN_XC_AUTODOWNLOAD_CLIENT enClient)14069 E_APIXC_ReturnValue SYMBOL_WEAK MApi_XC_AutoDownload_Fire(EN_XC_AUTODOWNLOAD_CLIENT enClient)
14070 {
14071     if (pu32XCInst == NULL)
14072     {
14073         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14074         return E_APIXC_RET_FAIL;
14075     }
14076 
14077     stXC_AUTODOWNLOAD_FIRE_CTRL XCArgs;
14078     XCArgs.enClient = enClient;
14079     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
14080     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_AUTODOWNLOAD_FIRE_CTRL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14081     {
14082         printf("Obtain XC engine fail\n");
14083         return E_APIXC_RET_FAIL;
14084     }
14085     else
14086     {
14087         return XCArgs.eReturnValue;
14088     }
14089 }
14090 #endif
14091 
14092 #ifdef UFO_XC_HDR
14093 #if (UFO_XC_HDR_VERSION == 2)
MApi_XC_HDR_Control_U2(void * pInstance,EN_XC_HDR_CTRL_TYPE enCtrlType,void * pParam)14094 E_APIXC_ReturnValue MApi_XC_HDR_Control_U2(void* pInstance, EN_XC_HDR_CTRL_TYPE enCtrlType, void *pParam)
14095 {
14096     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
14097     E_APIXC_ReturnValue eRet = E_APIXC_RET_FAIL;
14098     XC_LOG_TRACE(XC_DBGLEVEL_PARAMETER_TRACE, "HDR contrl type: %d.\n", enCtrlType);
14099 
14100     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14101     _XC_ENTRY(pInstance);
14102 
14103     eRet = MDrv_XC_HDR_Control(pInstance, enCtrlType, pParam);
14104 
14105     _XC_RETURN(pInstance);
14106     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14107     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
14108 
14109     return eRet;
14110 }
14111 
MApi_XC_HDR_Control(EN_XC_HDR_CTRL_TYPE enCtrlType,void * pParam)14112 E_APIXC_ReturnValue SYMBOL_WEAK MApi_XC_HDR_Control(EN_XC_HDR_CTRL_TYPE enCtrlType, void *pParam)
14113 {
14114     if (pu32XCInst == NULL)
14115     {
14116         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
14117         {
14118             printf("UtopiaOpen XC failed\n");
14119             return E_APIXC_RET_FAIL;
14120         }
14121     }
14122 
14123     stXC_HDR_CTRL XCArgs;
14124     XCArgs.enCtrlType= enCtrlType;
14125     XCArgs.pParam = pParam;
14126     XCArgs.eReturnValue = E_APIXC_RET_FAIL;
14127     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_HDR_CTRL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14128     {
14129         printf("Obtain XC engine fail\n");
14130         return E_APIXC_RET_FAIL;
14131     }
14132     else
14133     {
14134         return XCArgs.eReturnValue;
14135     }
14136 }
14137 #endif
14138 #endif
14139 
14140 #ifdef UFO_XC_PQ_PATH
MApi_XC_GetPQPathStatus_U2(void * pInstance,E_XC_PQ_Path_Type ePqPathType,MS_U16 u16Width,MS_U16 u16Height)14141 MS_BOOL MApi_XC_GetPQPathStatus_U2(void* pInstance, E_XC_PQ_Path_Type ePqPathType,  MS_U16 u16Width, MS_U16 u16Height)
14142 {
14143     return MDrv_XC_GetPQPathStatus(pInstance, ePqPathType, u16Width, u16Height);
14144 }
14145 
MApi_XC_GetPQPathStatus(E_XC_PQ_Path_Type ePqPathType,MS_U16 u16Width,MS_U16 u16Height)14146 MS_BOOL MApi_XC_GetPQPathStatus(E_XC_PQ_Path_Type ePqPathType, MS_U16 u16Width, MS_U16 u16Height)
14147 {
14148     if (pu32XCInst == NULL)
14149     {
14150         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14151         return E_APIXC_RET_FAIL;
14152     }
14153 
14154     stXC_GetPqPathStatus XCArgs;
14155     XCArgs.ePqPathType = ePqPathType;
14156     XCArgs.u16Height = u16Height;
14157     XCArgs.u16Width = u16Width;
14158     XCArgs.bReturnValue = FALSE;
14159 
14160     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_PQ_PATH, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14161     {
14162         printf("Obtain XC engine fail\n");
14163         return FALSE;
14164     }
14165     else
14166     {
14167         return XCArgs.bReturnValue;
14168     }
14169 }
14170 #endif
14171 
14172 static const char optee_xc[] = "opteearmtz00";
14173 char *_xc_device = (char *)optee_xc;
14174 TEEC_Context mstar_teec_ctx;
14175 ////#define MSTAR_TA_NAME       "mstara_internal_tests.ta"
14176 #define MSTAR_INTERNAL_XC_UUID {0x4dd53ca0, 0x0248, 0x11e6, \
14177       {0x86, 0xc0, 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b} }
14178 //#define SYS_TEEC_OPERATION_INITIALIZER { 0, 0, { { { 0 } } } }
14179 #define SYS_TEEC_OPERATION_INITIALIZER { 0 }
14180 TEEC_Session session = { 0 };
14181 TEEC_UUID uuid = MSTAR_INTERNAL_XC_UUID;
14182 TEEC_Operation op = SYS_TEEC_OPERATION_INITIALIZER;
14183 extern MS_U32 MDrv_SYS_TEEC_InitializeContext(const char *name, TEEC_Context *context);;
14184 extern MS_U32 MDrv_SYS_TEEC_Open(TEEC_Context *context, TEEC_Session *session, const TEEC_UUID *destination, MS_U32 connection_method, const void *connection_data, TEEC_Operation *operation, MS_U32 *error_origin);
14185 extern MS_U32 MDrv_SYS_TEEC_InvokeCmd(TEEC_Session *session, MS_U32 cmd_id, TEEC_Operation *operation, MS_U32 *error_origin);
14186 extern void MDrv_SYS_TEEC_Close(TEEC_Session *session);
14187 extern void MDrv_SYS_TEEC_FinalizeContext(TEEC_Context *context);
14188 
_MDrv_XC_OPTEE_Send_Cmd(void * pInstance,EN_XC_OPTEE_ACTION action,void * para,MS_U32 u32size)14189 MS_BOOL _MDrv_XC_OPTEE_Send_Cmd(void *pInstance,EN_XC_OPTEE_ACTION action,void *para,MS_U32 u32size)
14190 {
14191     MS_BOOL bret = FALSE;
14192 #ifdef MSOS_TYPE_LINUX
14193     unsigned int ret_orig= 0;
14194     if (MDrv_SYS_TEEC_InitializeContext(_xc_device, &mstar_teec_ctx) != TEEC_SUCCESS)
14195     {
14196         printf("%s %d: Init Context failed\n",__func__,__LINE__);
14197         MDrv_SYS_TEEC_FinalizeContext(&mstar_teec_ctx);
14198         return bret;
14199     }
14200 
14201     if (MDrv_SYS_TEEC_Open(&mstar_teec_ctx, &session, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &ret_orig) != TEEC_SUCCESS)
14202     {
14203         printf("%s %d: TEEC Open session failed\n",__func__,__LINE__);
14204         MDrv_SYS_TEEC_Close(&session);
14205         MDrv_SYS_TEEC_FinalizeContext(&mstar_teec_ctx);
14206         return bret;
14207     }
14208     op.params[0].tmpref.buffer = para;
14209     op.params[0].tmpref.size = u32size;
14210     op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
14211     if (MDrv_SYS_TEEC_InvokeCmd(&session, action, &op, &ret_orig) != TEEC_SUCCESS)
14212     {
14213         printf("%s %d: TEEC Invoke command failed\n",__func__,__LINE__);
14214     }
14215     else
14216     {
14217         bret = TRUE;
14218     }
14219     MDrv_SYS_TEEC_Close(&session);
14220     MDrv_SYS_TEEC_FinalizeContext(&mstar_teec_ctx);
14221 #endif
14222     return bret;
14223 
14224 }
MDrv_XC_OPTEE_Control(void * pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER * pstxc_handler)14225 MS_BOOL MDrv_XC_OPTEE_Control(void *pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER* pstxc_handler)
14226 {
14227     MS_BOOL bopteeenable = FALSE;
14228     ///MS_U32 u32tmp_address = 0;
14229     ///MS_U32 u32offset = 0;
14230     MS_U32 u32Index = 0;
14231     MS_U32 u32Cnt=0;
14232     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14233     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14234     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14235 #ifndef MSOS_TYPE_OPTEE
14236 #ifndef DONT_USE_CMA
14237 #if (XC_SUPPORT_CMA ==TRUE)
14238     static MS_BOOL bIsGetCMA[CMA_XC_MEM_NUM] = {FALSE,};
14239 #endif
14240 #endif
14241 #endif
14242 
14243 #ifndef MSOS_TYPE_OPTEE
14244     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14245 #else
14246     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14247 #endif
14248     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14249     /*
14250     ** if SC2 - main as SC0 - sub ,take care this as sub , therefore eWindow id has to be take case specilly
14251     */
14252 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14253     if (psXCInstPri->u32DeviceID == 1 && pstxc_handler->eWindow == MAIN_WINDOW)
14254     {
14255         pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].eWindow = SUB_WINDOW; //if PIP_SUB special case
14256     }else
14257 #endif
14258     {
14259         pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].eWindow = pstxc_handler->eWindow; //if PIP_SUB special case
14260     }
14261 
14262     //Check XC_OPTEE_HANDLER structure size and version
14263     pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].version = XC_OPTEE_HANDLER_VERSION;
14264     pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].length = sizeof(XC_OPTEE_HANDLER);
14265 
14266     printf("Size of XC_OPTEE_HANDLER in REE = %d, xc_handler = %td\n", sizeof(XC_OPTEE_HANDLER), (ptrdiff_t)pstxc_handler->length);
14267     printf("Verion in REE = %d, xc_handler =%d\n", XC_OPTEE_HANDLER_VERSION, pstxc_handler->version);
14268     if((pstxc_handler->length != sizeof(XC_OPTEE_HANDLER)) || (pstxc_handler->version != XC_OPTEE_HANDLER_VERSION))
14269     {
14270         printf("REE and xc_handler(input parameter) not match!\n");
14271     }
14272 
14273     switch (action)
14274     {
14275 //********relay SN*********//
14276         case E_XC_OPTEE_GET_PIPE_ID:
14277             //get pipe in into shm'
14278 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14279             if (psXCInstPri->u32DeviceID == 1 && pstxc_handler->eWindow == MAIN_WINDOW)
14280             {
14281                 pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].pipeID =pipeID_SC1_main;//?
14282                 pstxc_handler->pipeID = pipeID_SC1_main;
14283             }else if(psXCInstPri->u32DeviceID == 0)
14284 #endif
14285             {
14286                 if(pstxc_handler->eWindow == MAIN_WINDOW)
14287                 {
14288                     pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].pipeID = pipeID_SC0_main;
14289                     pstxc_handler->pipeID = pipeID_SC0_main;
14290                 }
14291                 else
14292                 {
14293                     pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].pipeID = pipeID_SC0_sub;
14294                     pstxc_handler->pipeID = pipeID_SC0_sub;
14295                 }
14296             }
14297             break;
14298         case E_XC_OPTEE_ENABLE:
14299             //reset forst
14300             pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].drams_cnt = 0;
14301             pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].regs_cnt = 0;
14302 
14303             if (pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].isEnable == TRUE)
14304             {
14305                 bopteeenable = TRUE;
14306             }
14307             pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].isEnable = TRUE;
14308 
14309             //on flag , get cma , set_handler
14310 #ifndef MSOS_TYPE_OPTEE
14311 #ifndef DONT_USE_CMA
14312 #if (XC_SUPPORT_CMA ==TRUE)
14313             if(psXCInstPri->u32DeviceID == 0 && pstxc_handler->eWindow == MAIN_WINDOW)
14314             {
14315                 MS_U32 au32CMAMemSCMSize[CMA_XC_MEM_NUM] = {0, };
14316                 MS_U32 au32CMAMemFRCMSize[CMA_XC_MEM_NUM] = {0, };
14317                 MS_U32 u32DualMiuMemSize = 0;
14318                 XC_CMA_CLIENT enXCCMAClient = CMA_XC_MEM_NUM;
14319                 static MS_PHY u32CMAAddr[CMA_XC_MEM_NUM] = {0, };
14320 
14321                 //get cma
14322                 MHal_XC_Get_CMA_UsingCondition(pInstance, bIsGetCMA, au32CMAMemSCMSize, au32CMAMemFRCMSize, &u32DualMiuMemSize, CMA_XC_MEM_NUM, pstxc_handler->eWindow);
14323                 if (u32DualMiuMemSize != 0)
14324                 {
14325                     enXCCMAClient = CMA_XC_SELF_MEM;
14326                 }
14327                 else
14328                 {
14329                     if (bIsGetCMA[CMA_XC_COBUFF_MEM] == TRUE)
14330                     {
14331                         enXCCMAClient = CMA_XC_COBUFF_MEM;
14332                     }
14333                     else
14334                     {
14335                         enXCCMAClient = CMA_XC_SELF_MEM;
14336                     }
14337                 }
14338                 if (bopteeenable == FALSE)
14339                 {
14340                     u32CMAAddr[enXCCMAClient] = MHal_XC_Get_CMA_Addr(pInstance, enXCCMAClient,  au32CMAMemSCMSize[enXCCMAClient]+au32CMAMemFRCMSize[enXCCMAClient], pstxc_handler->eWindow);
14341                 }
14342                 Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,u32CMAAddr[enXCCMAClient], au32CMAMemSCMSize[enXCCMAClient]);
14343 #if (HW_DESIGN_4K2K_VER == 4)
14344                 Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,u32CMAAddr[enXCCMAClient]+au32CMAMemSCMSize[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient]);
14345 #endif
14346 #if (HW_DESIGN_4K2K_VER == 4)
14347                 if(au32CMAMemSCMSize[enXCCMAClient] == 0)
14348                 {
14349                     // default frcm frame buffer address init
14350                     MDrv_XC_SetFRCMFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], pstxc_handler->eWindow);
14351                     // default frame buffer address init
14352                     MDrv_XC_SetFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], pstxc_handler->eWindow);
14353                 }
14354                 else
14355 #endif
14356                 {
14357 #if (HW_DESIGN_4K2K_VER == 4)
14358                     // default frcm frame buffer address init
14359                     MDrv_XC_SetFRCMFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient]+au32CMAMemSCMSize[enXCCMAClient], au32CMAMemFRCMSize[enXCCMAClient], pstxc_handler->eWindow);
14360 #endif
14361                     // default frame buffer address init
14362                     MDrv_XC_SetFrameBufferAddress(pInstance, u32CMAAddr[enXCCMAClient], au32CMAMemSCMSize[enXCCMAClient], pstxc_handler->eWindow);
14363                 }
14364                 gSrcInfo[pstxc_handler->eWindow].u32PreCMAMemSCMSize[enXCCMAClient] = au32CMAMemSCMSize[enXCCMAClient];
14365                 gSrcInfo[pstxc_handler->eWindow].u32PreCMAMemFRCMSize[enXCCMAClient] = 0;
14366 
14367                 ///u32offset = _XC_Device_Offset[psXCInstPri->u32DeviceID];
14368                 ///u32tmp_address = u32CMAAddr[enXCCMAClient];
14369             }
14370             else
14371 #endif
14372 #endif
14373             {
14374                 pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].isEnable = TRUE;
14375                 if (pstxc_handler->eWindow == MAIN_WINDOW)
14376                 {
14377                     ///u32tmp_address = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr;
14378                     Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Start_Addr, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FB_Size);
14379 #if (HW_DESIGN_4K2K_VER == 4)
14380                     Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Start_Addr, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Main_FRCM_FB_Size);
14381 #endif
14382                 }
14383                 else if (pstxc_handler->eWindow == SUB_WINDOW)
14384                 {
14385                     ///u32tmp_address = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr;
14386                     Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Start_Addr, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FB_Size);
14387 #if (HW_DESIGN_4K2K_VER == 4)
14388                     Hal_SC_add_dram_to_shm(pInstance,pstxc_handler->eWindow,pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Start_Addr, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32Sub_FRCM_FB_Size);
14389 #endif
14390                 }
14391                 ///u32offset = _XC_Device_Offset[psXCInstPri->u32DeviceID];
14392             }
14393 #endif
14394             ///u32tmp_address /=BYTE_PER_WORD;
14395             Hal_SC_update_to_shm(pInstance, pstxc_handler->eWindow);
14396 #if 0
14397             if (pstxc_handler->eWindow == MAIN_WINDOW)
14398             {
14399             Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK0D_38_L,(BIT(0) | BIT(4)), (BIT(0) | BIT(4)));
14400             Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_08_L, (u32tmp_address & 0xFFFF), 0xFFFF);
14401             Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_09_L, (u32tmp_address >> 16), 0xFFFF);
14402             Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_1C_L, 0x0000, 0xFFFF);
14403             }
14404             else if (pstxc_handler->eWindow == SUB_WINDOW)
14405             {
14406                 Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK0D_38_L,(BIT(1) | BIT(6)), (BIT(1) | BIT(6)));
14407                 Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_48_L, (u32tmp_address & 0xFFFF), 0xFFFF);
14408                 Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_49_L, (u32tmp_address >> 16), 0xFFFF);
14409                 Hal_SC_add_reg_to_shm(pInstance,pstxc_handler->eWindow,REG_SC_BK12_5C_L, 0x0000, 0xFFFF);
14410             }
14411 #endif
14412             _MDrv_XC_OPTEE_Send_Cmd(pInstance,E_XC_OPTEE_SYNC_HANDLER,&pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow],sizeof(XC_OPTEE_HANDLER));
14413             break;
14414         case E_XC_OPTEE_DISABLE:
14415             //off flag
14416             bopteeenable = TRUE;
14417             if (pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].isEnable == FALSE)
14418             {
14419                 bopteeenable = FALSE;
14420             }
14421             pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].isEnable = FALSE;
14422 #ifndef MSOS_TYPE_OPTEE
14423             if(psXCInstPri->u32DeviceID == 0 && pstxc_handler->eWindow == MAIN_WINDOW)
14424             {
14425 #ifndef DONT_USE_CMA
14426 #if (XC_SUPPORT_CMA ==TRUE)
14427                 if (bopteeenable == TRUE)
14428                 {
14429                     if (bIsGetCMA[CMA_XC_COBUFF_MEM] == TRUE)
14430                     {
14431                         MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
14432                     }
14433                     else if(bIsGetCMA[CMA_XC_SELF_MEM] == TRUE)
14434                     {
14435                         MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
14436                     }
14437                 }
14438 #endif
14439 #endif
14440             }
14441 #endif
14442             break;
14443 //*******pipe only********//
14444         case E_XC_OPTEE_SET_HANDLER:
14445             _MDrv_XC_OPTEE_Send_Cmd(pInstance,E_XC_OPTEE_SYNC_HANDLER,&pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow],sizeof(XC_OPTEE_HANDLER));
14446             break;
14447         case E_XC_OPTEE_SYNC_HANDLER:
14448             memcpy(&pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow],pstxc_handler,sizeof(XC_OPTEE_HANDLER));
14449 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14450             if (psXCInstPri->u32DeviceID == 1 && pstxc_handler->eWindow == MAIN_WINDOW)
14451             {
14452                 pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].eWindow = SUB_WINDOW; //if PIP_SUB special case
14453             }else
14454 #endif
14455             {
14456                 pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].eWindow = pstxc_handler->eWindow; //if PIP_SUB special case
14457             }
14458             break;
14459         case E_XC_OPTEE_GET_HANDLER:
14460             //get from shm
14461             memcpy(pstxc_handler,&pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow],sizeof(XC_OPTEE_HANDLER));
14462             break;
14463         case E_XC_OPTEE_UPDATE_HANDLER:
14464             //****set seal directly****//
14465             memcpy(&pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow],pstxc_handler,sizeof(XC_OPTEE_HANDLER));
14466             u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].regs_cnt;
14467             for(u32Index = 0 ; u32Index < u32Cnt ; u32Index++)
14468             {
14469                         if (u32Index>= OP_TEE_XC_REG_MAX_CNT)
14470             {
14471                     printf("array size overflow for xc part");
14472                     break;
14473                 }
14474                 MDrv_Write2ByteMask(pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].regs_data[u32Index].bk
14475                                   , pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].regs_data[u32Index].value
14476                                   , pXCResourcePrivate->sthal_Optee.op_tee_xc[pstxc_handler->eWindow].regs_data[u32Index].mask);
14477             }
14478             break;
14479         default:
14480             break;
14481     }
14482     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14483     return TRUE;
14484 }
MApi_XC_OPTEE_Control_U2(void * pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER * xc_handler)14485 MS_BOOL MApi_XC_OPTEE_Control_U2(void *pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER* xc_handler)
14486 {
14487     return MDrv_XC_OPTEE_Control(pInstance,action,xc_handler);
14488 }
MApi_XC_OPTEE_Control(EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER * xc_handler)14489 MS_BOOL MApi_XC_OPTEE_Control(EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER* xc_handler)
14490 {
14491     if (pu32XCInst == NULL)
14492     {
14493         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
14494         {
14495             printf("UtopiaOpen XC failed\n");
14496             return FALSE;
14497         }
14498     }
14499 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14500      if (pu32XCInst_1 == NULL)
14501      {
14502         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
14503         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
14504 
14505         stXCInstantAttribute.u32DeviceID = 1;
14506         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
14507         {
14508             printf("UtopiaOpen XC failed\n");
14509             return E_APIXC_RET_FAIL;
14510         }
14511       }
14512 #endif
14513     stXC_OPTEE_CTRL XCArgs;
14514     XCArgs.action = action;
14515     XCArgs.xc_handler = xc_handler;
14516     XCArgs.bReturn = FALSE;
14517 
14518     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OPTEE_CTL, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14519     {
14520         printf("Obtain XC engine fail\n");
14521         return FALSE;
14522     }
14523     else
14524     {
14525         return XCArgs.bReturn;
14526     }
14527 }
MDrv_XC_OPTEE_Update(void * pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER xc_handler)14528 MS_BOOL MDrv_XC_OPTEE_Update(void *pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_HANDLER xc_handler)
14529 {
14530     ///MS_U32 u32tmp_address;
14531     ///MS_U32 u32offset = 0;
14532     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14533     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14534     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14535 
14536     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14537     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14538     if(action != E_XC_OPTEE_UPDATE_HANDLER)
14539         return FALSE;
14540     //reset first
14541     // only update register setting, dram buffer lock max
14542     pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].regs_cnt = 0;
14543 
14544    /// u32tmp_address = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DNRBase0*BYTE_PER_WORD;
14545 
14546     pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].drams_data[0].address = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u32DNRBase0 * BYTE_PER_WORD;
14547 #if 0
14548     if(psXCInstPri->u32DeviceID == 0 && xc_handler.eWindow == MAIN_WINDOW)
14549     {
14550         //get cma
14551         u32offset = _XC_Device_Offset[psXCInstPri->u32DeviceID];
14552     }
14553     else
14554     {
14555         u32offset = _XC_Device_Offset[psXCInstPri->u32DeviceID];
14556     }
14557 #endif
14558 #if 0
14559     Hal_SC_add_reg_to_shm(pInstance,xc_handler.eWindow,REG_SC_BK0D_38_L,(BIT(0) | BIT(4)), (BIT(0) | BIT(4)));
14560     Hal_SC_add_reg_to_shm(pInstance,xc_handler.eWindow,REG_SC_BK12_08_L, (u32tmp_address & 0xFFFF), 0xFFFF);
14561     Hal_SC_add_reg_to_shm(pInstance,xc_handler.eWindow,REG_SC_BK12_09_L, (u32tmp_address >> 16), 0xFFFF);
14562     Hal_SC_add_reg_to_shm(pInstance,xc_handler.eWindow,REG_SC_BK12_1C_L, 0x0000, 0xFFFF);
14563 #endif
14564     Hal_SC_update_to_shm(pInstance, xc_handler.eWindow);
14565     //************************PRINT DATA*******************************//
14566     //MS_U32 tmp_x=0;
14567     //for(tmp_x=0;tmp_x < pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].regs_cnt;tmp_x++)
14568     //{
14569     //    printf("\033[1;32m[%s:%d][OPTEE][REG:%d] 0x%x:0x%x:0x%x\033[m\n",__FUNCTION__,__LINE__,tmp_x
14570     //        ,pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].regs_data[tmp_x].bk
14571     //        ,pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].regs_data[tmp_x].value
14572     //        ,pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow].regs_data[tmp_x].mask);
14573     //}
14574     //************************END PRINT DATA*******************************//
14575     _MDrv_XC_OPTEE_Send_Cmd(pInstance,E_XC_OPTEE_UPDATE_HANDLER,&pXCResourcePrivate->sthal_Optee.op_tee_xc[xc_handler.eWindow],sizeof(XC_OPTEE_HANDLER));
14576     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14577     return TRUE;
14578     //****go on
14579 }
MDrv_XC_OPTEE_Mux(void * pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)14580 MS_BOOL MDrv_XC_OPTEE_Mux(void *pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)
14581 {
14582     MS_U32 u32Index = 0;
14583     MS_U32 u32Cnt=0;
14584     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14585     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14586 
14587 #ifndef MSOS_TYPE_OPTEE
14588     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
14589 #else
14590     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14591 #endif
14592     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14593     switch (action)
14594     {
14595         case E_XC_OPTEE_SET_MUX:
14596             pXCResourcePrivate->sthal_Optee.op_tee_mux.bfire = TRUE;
14597             _MDrv_XC_OPTEE_Send_Cmd(pInstance,E_XC_OPTEE_SYNC_MUX,&pXCResourcePrivate->sthal_Optee.op_tee_mux,sizeof(XC_OPTEE_MUX_DATA));
14598             pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_cnt = 0;
14599             pXCResourcePrivate->sthal_Optee.op_tee_mux.bfire = FALSE;
14600             //printf("\033[1;32m[%s:%d][NORMAL]XC_OPTEE_MUX_DATA=%d\033[m\n",__FUNCTION__,__LINE__,sizeof(XC_OPTEE_MUX_DATA));
14601             break;
14602         case E_XC_OPTEE_SYNC_MUX:
14603             memcpy(&pXCResourcePrivate->sthal_Optee.op_tee_mux,&xc_mux_data,sizeof(XC_OPTEE_MUX_DATA));
14604             //************************PRINT DATA*******************************//
14605             //for(tmp_x=0;tmp_x < pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_cnt;tmp_x++)
14606            // {
14607            //     printf("\033[1;32m[%s:%d][OPTEE][REG:%d] 0x%x:0x%x:0x%x\033[m\n",__FUNCTION__,__LINE__,tmp_x
14608            //         ,pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[tmp_x].bk
14609            //         ,pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[tmp_x].value
14610            //         ,pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[tmp_x].mask);
14611            // }
14612             u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_cnt;
14613             for(u32Index = 0 ; u32Index < u32Cnt ; u32Index++)
14614             {
14615 
14616                 if (u32Index>= OP_TEE_XC_REG_MAX_CNT)
14617                 {
14618                     printf("array size overflow for ipmux part");
14619                     break;
14620                 }
14621                 MDrv_Write2ByteMask(pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].bk
14622                                   , pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].value
14623                                   , pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].mask);
14624             }
14625             //************************END PRINT DATA*******************************//
14626             break;
14627         case E_XC_OPTEE_GET_MUX:
14628             break;
14629         default:
14630             break;
14631     }
14632     return TRUE;
14633 }
MApi_XC_OPTEE_Mux_U2(void * pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)14634 MS_BOOL MApi_XC_OPTEE_Mux_U2(void *pInstance,EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)
14635 {
14636     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14637     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14638     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14639     MDrv_XC_OPTEE_Mux(pInstance,action,xc_mux_data);
14640     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14641     return TRUE;
14642 }
MApi_XC_OPTEE_Mux(EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)14643 MS_BOOL MApi_XC_OPTEE_Mux(EN_XC_OPTEE_ACTION action,XC_OPTEE_MUX_DATA xc_mux_data)
14644 {
14645     if (pu32XCInst == NULL)
14646     {
14647         if(UtopiaOpen(MODULE_XC, &pu32XCInst, 0, NULL) != UTOPIA_STATUS_SUCCESS)
14648         {
14649             printf("UtopiaOpen XC failed\n");
14650             return FALSE;
14651         }
14652     }
14653 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
14654      if (pu32XCInst_1 == NULL)
14655      {
14656         XC_INSTANT_ATTRIBUTE stXCInstantAttribute;
14657         INIT_XC_INSTANT_ATTR(stXCInstantAttribute);
14658 
14659         stXCInstantAttribute.u32DeviceID = 1;
14660         if(UtopiaOpen(MODULE_XC, &pu32XCInst_1, 0, &stXCInstantAttribute) != UTOPIA_STATUS_SUCCESS)
14661         {
14662             printf("UtopiaOpen XC failed\n");
14663             return E_APIXC_RET_FAIL;
14664         }
14665       }
14666 #endif
14667     stXC_OPTEE_MUX XCArgs;
14668     XCArgs.action = action;
14669     XCArgs.xc_mux_data = xc_mux_data;
14670     XCArgs.bReturn = FALSE;
14671 
14672     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OPTEE_MUX, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14673     {
14674         printf("Obtain XC engine fail\n");
14675         return FALSE;
14676     }
14677     else
14678     {
14679         return XCArgs.bReturn;
14680     }
14681 }
14682 
14683 #ifdef MSOS_TYPE_OPTEE
14684 static EN_XC_OPTEE_TIMER_STATUS status=E_XC_OPTEE_TIMER_TEE_DISABLE;
14685 static MS_U8 u8OpteeErrorCnt = 0;
14686 #endif
_Mdrv_XC_OPTEE_CheckRBase_Handler(void * pParam,SCALER_WIN eWindow)14687 static MS_BOOL _Mdrv_XC_OPTEE_CheckRBase_Handler(void * pParam,SCALER_WIN eWindow)
14688 {
14689 #if defined(MSOS_TYPE_OPTEE) && defined(SUPPORT_READLIMIT_1BIT_NS_SW)
14690     MS_BOOL bRBaseLegal = TRUE;
14691     void *pInstance = pu32XCInst_private;
14692     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14693     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14694 
14695     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14696     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14697 
14698     if(!pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable)
14699     {
14700         status = E_XC_OPTEE_TIMER_TEE_DISABLE;
14701         u8OpteeErrorCnt = 0;
14702     }
14703 
14704     switch (status)
14705     {
14706         case E_XC_OPTEE_TIMER_TEE_DISABLE:
14707             if(pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable)
14708             {
14709                 status = E_XC_OPTEE_TIMER_TEE_ENABLE;
14710             }
14711             break;
14712         case E_XC_OPTEE_TIMER_TEE_ENABLE:
14713             if(Hal_SC_secure_Check_RBase(pInstance) == FALSE)
14714             {
14715                 u8OpteeErrorCnt++;
14716                 status = E_XC_OPTEE_TIMER_TEE_RBASE_ABNORMAL;
14717             }
14718             break;
14719         case E_XC_OPTEE_TIMER_TEE_RBASE_ABNORMAL:
14720             if(Hal_SC_secure_Check_RBase(pInstance) == FALSE)
14721             {
14722                 u8OpteeErrorCnt++;
14723                 if(u8OpteeErrorCnt > MAX_OPTEE_ERROR_CNT)
14724                 {
14725                     status = E_XC_OPTEE_TIMER_TEE_CRASH;
14726                 }
14727             }
14728             else
14729             {
14730                 status = E_XC_OPTEE_TIMER_TEE_ENABLE;
14731                 u8OpteeErrorCnt = 0;
14732             }
14733             break;
14734         case E_XC_OPTEE_TIMER_TEE_CRASH:
14735             bRBaseLegal = FALSE;
14736             break;
14737         default:
14738             break;
14739     }
14740     return bRBaseLegal;
14741 #else
14742     return TRUE;
14743 #endif
14744 }
14745 
MApi_XC_OPTEE_CheckRBase_U2(void * pInstance,SCALER_WIN eWindow)14746 MS_BOOL MApi_XC_OPTEE_CheckRBase_U2(void* pInstance,SCALER_WIN eWindow)
14747 {
14748     return _Mdrv_XC_OPTEE_CheckRBase_Handler(pInstance,eWindow);
14749 }
14750 
MApi_XC_OPTEE_CheckRBase(SCALER_WIN eWindow)14751 MS_BOOL MApi_XC_OPTEE_CheckRBase(SCALER_WIN eWindow)
14752 {
14753     if (pu32XCInst == NULL)
14754     {
14755         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14756         return E_APIXC_RET_FAIL;
14757     }
14758 
14759     stXC_OPTEE_CheckRBase XCArgs;
14760     XCArgs.eWindow = eWindow;
14761     XCArgs.bReturn = FALSE;
14762 
14763     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_OPTEE_CHECKRBASE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14764     {
14765         printf("Obtain XC engine fail\n");
14766         return FALSE;
14767     }
14768     else
14769     {
14770         return XCArgs.bReturn;
14771     }
14772 }
14773 
14774 #ifdef MSOS_TYPE_OPTEE
_MDrv_XC_PipID_Trans(MS_U32 u32PipeID)14775 static MS_U32 _MDrv_XC_PipID_Trans(MS_U32 u32PipeID)
14776 {
14777     if(u32PipeID == pipeID_SC0_main)
14778         return MAIN_WINDOW;
14779     else if (u32PipeID == pipeID_SC0_sub)
14780         return SUB_WINDOW;
14781     else if (u32PipeID == pipeID_SC1_main)
14782         return MAIN_WINDOW;
14783     else
14784         return 0xFFFF;
14785 }
14786 #endif
MApi_XC_GetResourceByPipeID_U2(void * pInstance,MS_U32 u32PipeID,MS_U32 * U32RetResNum,RESOURCE * pResource)14787 MS_U32 MApi_XC_GetResourceByPipeID_U2(void* pInstance,MS_U32 u32PipeID, MS_U32*  U32RetResNum, RESOURCE* pResource)
14788 {
14789     /// pResource: return scaler memory information
14790     /// U32RetResNum: check resource number max
14791 #ifdef MSOS_TYPE_OPTEE
14792     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14793     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14794     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14795     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14796     MS_U32 eWindow = _MDrv_XC_PipID_Trans(u32PipeID);
14797 
14798     //id[3]: 0, id[2]=address_h, id[1]=address_l, id[0]=length
14799     // 0: SCM Dram buffer
14800     pResource[0].ID[0] = ((SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_42_L) & 0xFFFFFFFF) - (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_40_L) & 0xFFFFFFFF))*BYTE_PER_WORD;
14801     pResource[0].ID[1] = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L) & 0xFFFFFFFF)*BYTE_PER_WORD;
14802     pResource[0].ID[2] = 0;
14803     pResource[0].ID[3] = 0;
14804     #if (HW_DESIGN_4K2K_VER == 4)
14805     //id[3]: 0, id[2]=address_h, id[1]=address_l, id[0]=length
14806     // 1: FRCM Dram buffer
14807     pResource[1].ID[0] = pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[1].length;
14808     pResource[1].ID[1] = pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[1].address & 0xFFFFFFFF;
14809     pResource[1].ID[2] = 0;
14810     pResource[1].ID[3] = 0;
14811     #endif
14812     if(pResource[0].ID[0]==0 ) //If FBL ,DO not lock
14813         *U32RetResNum=0;
14814 #endif
14815     return UTOPIA_STATUS_SUCCESS;
14816 }
MApi_XC_GetResourceByPipeID(MS_U32 u32PipeID,MS_U32 * U32RetResNum,RESOURCE * pResource)14817 MS_U32 MApi_XC_GetResourceByPipeID(MS_U32 u32PipeID, MS_U32*  U32RetResNum, RESOURCE* pResource)
14818 {
14819     if (pu32XCInst == NULL)
14820     {
14821         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14822         return E_APIXC_RET_FAIL;
14823     }
14824 
14825     stXC_GetResourceByPipeID XCArgs;
14826     XCArgs.u32PipeID = u32PipeID;
14827     XCArgs.U32RetResNum = U32RetResNum;
14828     XCArgs.pResource = pResource;
14829     XCArgs.u32ReturnValue = UTOPIA_STATUS_FAIL;
14830 
14831     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_RES_BY_PIPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14832     {
14833         printf("Obtain XC engine fail\n");
14834         return UTOPIA_STATUS_FAIL;
14835     }
14836     else
14837     {
14838         return XCArgs.u32ReturnValue;
14839     }
14840 
14841 }
MApi_XC_ConfigPipe_U2(void * pInstance,MS_U32 u32PipeID,MS_U32 u32SecureDMA,MS_U32 u32OperationMode)14842 MS_U32 MApi_XC_ConfigPipe_U2(void* pInstance,MS_U32 u32PipeID, MS_U32 u32SecureDMA, MS_U32 u32OperationMode)
14843 {
14844 #ifdef MSOS_TYPE_OPTEE
14845     /// u32SecureDMA: memory lock
14846     /// u32OperationMode: RIU register lock
14847     MS_U32 u32Index = 0;
14848     MS_U32 u32Cnt=0;
14849     MS_U32 eWindow = _MDrv_XC_PipID_Trans(u32PipeID);
14850     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14851     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14852     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14853     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14854     if(Hal_SC_secure_lock(pInstance, eWindow, u32SecureDMA, u32OperationMode) == FALSE)
14855     {
14856         return UTOPIA_STATUS_FAIL;
14857     }
14858     u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt;
14859 
14860     for(u32Index = 0 ; u32Index < u32Cnt ; u32Index++)
14861     {
14862         if (u32Index>= OP_TEE_XC_REG_MAX_CNT)
14863         {
14864             printf("array size overflow for xc part");
14865             return UTOPIA_STATUS_FAIL;
14866         }
14867         MDrv_Write2ByteMask(pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Index].bk
14868                           , pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Index].value
14869                           , pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Index].mask);
14870     }
14871     u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_cnt;
14872     for(u32Index = 0 ; u32Index < u32Cnt ; u32Index++)
14873     {
14874         if (u32Index>= OP_TEE_XC_REG_MAX_CNT)
14875         {
14876             printf("array size overflow for ipmux part");
14877             return UTOPIA_STATUS_FAIL;
14878         }
14879         MDrv_Write2ByteMask(pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].bk
14880                           , pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].value
14881                           , pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Index].mask);
14882     }
14883 
14884 #endif
14885     return UTOPIA_STATUS_SUCCESS;
14886 }
MApi_XC_ConfigPipe(MS_U32 u32PipeID,MS_U32 u32SecureDMA,MS_U32 u32OperationMode)14887 MS_U32 MApi_XC_ConfigPipe(MS_U32 u32PipeID, MS_U32 u32SecureDMA, MS_U32 u32OperationMode)
14888 {
14889     if (pu32XCInst == NULL)
14890     {
14891         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14892         return E_APIXC_RET_FAIL;
14893     }
14894 
14895     stXC_ConfigPipe XCArgs;
14896     XCArgs.u32PipeID = u32PipeID;
14897     XCArgs.u32SecureDMA = u32SecureDMA;
14898     XCArgs.u32OperationMode = u32OperationMode;
14899     XCArgs.u32ReturnValue = UTOPIA_STATUS_FAIL;
14900     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CONFIG_PIPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14901     {
14902         printf("Obtain XC engine fail\n");
14903         return UTOPIA_STATUS_FAIL;
14904     }
14905     else
14906     {
14907         return XCArgs.u32ReturnValue;
14908     }
14909 }
MApi_XC_CheckPipe_U2(void * pInstance,MS_U32 u32PipeID,MS_U32 u32SecureDMA,MS_U32 u32OperationMode)14910 MS_U32 MApi_XC_CheckPipe_U2(void* pInstance,MS_U32 u32PipeID, MS_U32 u32SecureDMA, MS_U32 u32OperationMode)
14911 {
14912 #ifdef MSOS_TYPE_OPTEE
14913     /// check PipeID is correct or not
14914     /// u32SecureDMA: memory lock
14915     /// u32OperationMode: RIU register lock
14916     ///MS_U32 u32Index = 0;
14917     ///MS_U32 u32Cnt=0;
14918     MS_U32 eWindow = _MDrv_XC_PipID_Trans(u32PipeID);
14919     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14920     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14921     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14922 
14923     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
14924     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
14925 
14926     if(pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].isEnable == FALSE)
14927     {
14928         // if there is not enable return fail
14929         _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14930         return UTOPIA_STATUS_FAIL;
14931     }
14932 #if 0
14933     u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt;
14934     //How to get data correctly
14935     for(u32Index = 0 ; u32Index < u32Cnt ; u32Cnt++)
14936     {
14937         if(pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Cnt].value != (MDrv_Read2Byte( pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Cnt].bk)| pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[u32Cnt].mask ))
14938         {
14939             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14940             return UTOPIA_STATUS_FAIL;
14941         }
14942     }
14943     u32Cnt = pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_cnt;
14944     for(u32Index = 0 ; u32Index < u32Cnt ; u32Cnt++)
14945     {
14946         if( pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Cnt].value != (MDrv_Read2Byte( pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Cnt].bk )| pXCResourcePrivate->sthal_Optee.op_tee_mux.regs_data[u32Cnt].mask ))
14947         {
14948             _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14949             return UTOPIA_STATUS_FAIL;
14950         }
14951     }
14952 #endif
14953 #endif
14954     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14955     return UTOPIA_STATUS_SUCCESS; // success
14956 }
MApi_XC_CheckPipe(MS_U32 u32PipeID,MS_U32 u32SecureDMA,MS_U32 u32OperationMode)14957 MS_U32 MApi_XC_CheckPipe(MS_U32 u32PipeID, MS_U32 u32SecureDMA, MS_U32 u32OperationMode)
14958 {
14959     if (pu32XCInst == NULL)
14960     {
14961         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
14962         return E_APIXC_RET_FAIL;
14963     }
14964 
14965     stXC_CheckPipe XCArgs;
14966     XCArgs.u32PipeID = u32PipeID;
14967     XCArgs.u32SecureDMA = u32SecureDMA;
14968     XCArgs.u32OperationMode = u32OperationMode;
14969     XCArgs.u32ReturnValue = UTOPIA_STATUS_FAIL;
14970     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_CHECK_PIPE, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
14971     {
14972         printf("Obtain XC engine fail\n");
14973         return UTOPIA_STATUS_FAIL;
14974     }
14975     else
14976     {
14977         return XCArgs.u32ReturnValue;
14978     }
14979 }
14980 
MApi_XC_SetSWDRInfo_U2(void * pInstance,XC_SWDR_INFO * pSWDR_INFO)14981 MS_BOOL MApi_XC_SetSWDRInfo_U2(void* pInstance, XC_SWDR_INFO *pSWDR_INFO)
14982 {
14983     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
14984     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
14985     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
14986     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
14987     _XC_ENTRY(pInstance);
14988 
14989     MDrv_XC_SetSWDRInfo(pInstance,pSWDR_INFO);
14990 
14991     _XC_RETURN(pInstance);
14992     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
14993     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
14994     return TRUE;
14995 }
14996 
MApi_XC_SetSWDRInfo(XC_SWDR_INFO * pSWDR_INFO)14997 MS_BOOL MApi_XC_SetSWDRInfo(XC_SWDR_INFO *pSWDR_INFO)
14998 {
14999     if (pu32XCInst == NULL)
15000     {
15001         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
15002         return E_GET_PIXEL_RET_OUT_OF_RANGE;
15003     }
15004 
15005     stXC_SWDR_INFO XCArgs;
15006     XCArgs.pSWDR_INFO = pSWDR_INFO;
15007     XCArgs.bReturnValue = UTOPIA_STATUS_FAIL;
15008 
15009     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_SET_SWDR_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
15010     {
15011         printf("Obtain XC engine fail\n");
15012         return UTOPIA_STATUS_FAIL;
15013     }
15014     else
15015     {
15016         return XCArgs.bReturnValue;
15017     }
15018 }
15019 
MApi_XC_GetSWDRInfo_U2(void * pInstance,XC_SWDR_INFO * pSWDR_INFO)15020 MS_BOOL MApi_XC_GetSWDRInfo_U2(void* pInstance, XC_SWDR_INFO *pSWDR_INFO)
15021 {
15022     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
15023     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15024     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15025     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15026     _XC_ENTRY(pInstance);
15027 
15028     MDrv_XC_GetSWDRInfo(pInstance,pSWDR_INFO);
15029 
15030     _XC_RETURN(pInstance);
15031     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15032     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
15033     return TRUE;
15034 }
15035 
MApi_XC_GetSWDRInfo(XC_SWDR_INFO * pSWDR_INFO)15036 MS_BOOL MApi_XC_GetSWDRInfo(XC_SWDR_INFO *pSWDR_INFO)
15037 {
15038     if (pu32XCInst == NULL)
15039     {
15040         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
15041         return E_GET_PIXEL_RET_OUT_OF_RANGE;
15042     }
15043 
15044     stXC_SWDR_INFO XCArgs;
15045     XCArgs.pSWDR_INFO = pSWDR_INFO;
15046     XCArgs.bReturnValue = UTOPIA_STATUS_FAIL;
15047 
15048     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_SWDR_INFO, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
15049     {
15050         printf("Obtain XC engine fail\n");
15051         return UTOPIA_STATUS_FAIL;
15052     }
15053     else
15054     {
15055         return XCArgs.bReturnValue;
15056     }
15057 }
15058 
15059 #ifdef UFO_XC_SUPPORT_HDMI_DOWNSCALE_OUTPUT_POLICY
MApi_XC_GetHDMIPolicy_U2(void * pInstance)15060 MS_U32 MApi_XC_GetHDMIPolicy_U2(void* pInstance)
15061 {
15062     MS_U32 u32HDMIPolicy = 0;
15063     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Entry\n");
15064     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
15065     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
15066     _XC_SEMAPHORE_ENTRY(pInstance,E_XC_ID_VAR);
15067     _XC_ENTRY(pInstance);
15068     u32HDMIPolicy = MDrv_SC_GetHDMIPolicy(pInstance);
15069     _XC_RETURN(pInstance);
15070     _XC_SEMAPHORE_RETURN(pInstance,E_XC_ID_VAR);
15071     XC_LOG_TRACE(XC_DBGLEVEL_FUNCTION_TRACE, "Exit\n");
15072     return u32HDMIPolicy;
15073 }
15074 
MApi_XC_GetHDMIPolicy(void)15075 MS_U32 MApi_XC_GetHDMIPolicy(void)
15076 {
15077     if (pu32XCInst == NULL)
15078     {
15079         printf("[%s,%5d]No instance existed, please get an instance by calling MApi_XC_Init() first\n",__FUNCTION__,__LINE__);
15080         return E_APIXC_RET_FAIL;
15081     }
15082 
15083     stXC_GET_HDMIPOLICY XCArgs;
15084     XCArgs.u32HDMIPolicyInfo = 0;
15085 
15086     if(UtopiaIoctl(pu32XCInst, E_XC_CMD_GET_HDMIPOLICY, (void*)&XCArgs) != UTOPIA_STATUS_SUCCESS)
15087     {
15088         printf("Obtain XC engine fail\n");
15089         return UTOPIA_STATUS_FAIL;
15090     }
15091     else
15092     {
15093         return XCArgs.u32HDMIPolicyInfo;
15094     }
15095 }
15096 #endif
15097