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